2011-12-16 191 views
1

我試圖創建一個查詢包含從多個表中可選的聚合值,並有一定的困難。我將盡力將我的問題簡化爲儘可能少的字段。多個左連接

應用

appid | pageid 

比賽

id | appid | winnerid 

註冊等

id | contestid | firstname | lastname 

推薦

id | signupid 

門票

id | signupid 

查詢的目的

我想基礎上,的pageid參數的應用程序和競賽表結合起來,加入註冊等表來獲得獲勝者可用時,然後計算所有註冊,轉介和門票,或者在沒有可用的情況下僅爲零值。

到目前爲止我有什麼

SELECT t1.*, `Winner`.Name AS Winner, IFNULL(`srt`.Signups,0) AS Signups, 
    IFNULL(`srt`.Referrals,0) AS Referrals, 
    IFNULL(`srt`.Tickets,0) AS Tickets 
FROM applications a, (contests c LEFT JOIN 

    /* Join signups table to retrieve winner's first/last name */ 
    (SELECT id, contestid, CONCAT(firstname, ' ' , lastname) AS Name 
    FROM signups) `Winner` 
    ON c.winnerid = `Winner`.id 
    AND c.contestid = `Winner`.contestid) LEFT JOIN 

    /* Join signups, referrals, and tickets to retrieve counts */ 
    (SELECT s.signupid, COUNT(*) AS Signups, Referrals, Tickets 
    FROM (signups s LEFT JOIN 
    (SELECT r.signupid, COUNT(r.id) AS Referrals 
    FROM signups s, referrals r 
    WHERE s.signupid = r.signupid) `Referrals` 
     ON s.signupid = `Referrals`.signupid) LEFT JOIN 
     (SELECT t.signupid, COUNT(t.id) AS Tickets 
      FROM signups s, tickets t 
      WHERE s.signupid = t.signupid) `Tickets` 
      ON s.signupid = `Tickets`.signupid) `srt` 
       ON signupid = `srt`.signupid 

WHERE a.id = c.applicationid 
AND a.pageid = @pageid 
ORDER BY c.id IN (SELECT id FROM contests WHERE active = 1) desc, c.addeddate desc; 

問題

我敢肯定這是不是做什麼,我試圖做的,不管是最有效的方法它不起作用。註冊/推介/門票的值只是返回每個表中每條記錄的計數。獲勝者加入工作正常,如果我只限於註冊,那也可以。註冊表鏈接到比賽表,然後推介和門票直接與註冊表相關。任何幫助這個複雜的查詢將不勝感激。

回答

1

原諒我,如果我的誤解,也是對我缺乏MSSQL和MySQL之間的差異的知識,但我會嘗試這樣的事:

SELECT 
    (SELECT CONCAT(IFNULL(firstname,''), ' ' , IFNULL(lastname,'')) 
     FROM Signups 
     WHERE id = c.winnerid) as Winner, 
    (SELECT COUNT(*) 
     FROM Signups 
     WHERE contestid = c.id) as Signups, 
    (SELECT COUNT(*) 
     FROM referrals r LEFT JOIN signups su ON r.signupid = su.id 
     WHERE su.contestid = c.id) as Referrals, 
    (SELECT COUNT(*) 
     FROM tickets t LEFT JOIN signups su ON t.signupid = su.id 
     WHERE su.contestid = c.id) as Tickets 
FROM 
    Contests c 
+0

其實,這完美地工作。我甚至沒有考慮嘗試select子句中的連接。我只是將c。*添加到select子句併成功!謝謝傑夫! – Jeremy 2011-12-16 16:49:22