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