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;
問題
我敢肯定這是不是做什麼,我試圖做的,不管是最有效的方法它不起作用。註冊/推介/門票的值只是返回每個表中每條記錄的計數。獲勝者加入工作正常,如果我只限於註冊,那也可以。註冊表鏈接到比賽表,然後推介和門票直接與註冊表相關。任何幫助這個複雜的查詢將不勝感激。
其實,這完美地工作。我甚至沒有考慮嘗試select子句中的連接。我只是將c。*添加到select子句併成功!謝謝傑夫! – Jeremy 2011-12-16 16:49:22