2011-12-16 156 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