2009-10-13 29 views
0

不管出於何種原因,MySQL不支持View中的子查詢。我被困在使用MySQL的未來,我需要編寫一個View來將EAV樣式表中的數據聚合成更易讀的格式。 View本身將作爲Ruby on Rails應用程序的模型(它是隻讀的,所以我可以安全地使用視圖)。如何重寫這個複雜的SQL查詢以便不使用MySQL查看的子查詢?

如果我可以的話,我怎麼能重寫這個野獸,以便能夠創造出一個觀點呢?我想,如果我不得不我可以創建一系列迷你視圖,然後創建一個主視圖(一個視圖來統治所有視圖,但情況可能如此),但我想知道還有另一種方法。

這是怪物;在大量的外部聯接是因爲所有的領域都是可選的,但我需要顯示所有的列:

select ls.subscriberid as id, l.name as list_name, 
    ifnull(cfn.first_name, '') as first_name, 
    ifnull(cln.last_name, '') as last_name, 
    ifnull(ce.email_address, '') as email_address, 
    ifnull(cm.mobile_phone, '') as mobile_phone 
from (
    select ls.subscriberid, ifnull(s.data, '') as first_name 
    from subscribers_data s 
     right outer join list_subscribers ls on ls.subscriberid = s.subscriberid 
    where s.fieldid = 2 /* First Name */ 
) cfn 
right outer join (
    select ls.subscriberid, ifnull(s.data, '') as last_name 
    from subscribers_data s 
     right outer join list_subscribers ls on ls.subscriberid = s.subscriberid 
    where s.fieldid = 3 /* Last Name */ 
) cln on cfn.subscriberid = cln.subscriberid 
right outer join (
    select ls.subscriberid, ls.emailaddress as email_address 
    from list_subscribers ls 
) ce on ce.subscriberid = cfn.subscriberid 
right outer join (
    select ls.subscriberid, ifnull(s.data, '') as mobile_phone 
    from subscribers_data s 
     right outer join list_subscribers ls on ls.subscriberid = s.subscriberid 
    where s.fieldid = 81 /* Mobile Phone */ 
) cm on cm.subscriberid = cfn.subscriberid 
right outer join list_subscribers ls on ls.subscriberid = cfn.subscriberid 
inner join lists l on ls.listid = l.listid 

回答

0

試試這個:

SELECT ls.subscriberid as id, l.name as list_name, 
     ifnull(group_concat(CASE WHEN s.fieldId = 2 
           THEN s.data 
           ELSE NULL 
          END), '') as first_name, 
     ifnull(group_concat(CASE WHEN s.fieldId = 3 
           THEN s.data 
           ELSE NULL 
          END), '') as last_name, 
     ifnull(ls.email_address, '') as email_address, 
     ifnull(group_concat(CASE WHEN s.fieldId = 81 
           THEN s.data 
           ELSE NULL 
          END), '') as mobile_phone 
    FROM list_subscribers ls 
INNER JOIN lists l on ls.listid = l.listid 
LEFT JOIN subscribers_data s on ls.subscriberid = s.subscriberid 
    GROUP BY ls.subscriberid, l.name, ls.email_address 
+0

這似乎是工作。感謝一堆! – 2009-10-13 18:53:51