2012-12-11 126 views
0

Hy everyone,在mysql中的复杂连接查询

我真的需要你的帮助。我必须获得以下所有用户的列表(不同): - 在比赛中进行现场签到(checkins.ctype ='live') - 他们最喜欢的球队(参见fanusers_teams) - 赢得3个或更多目标区别。

最喜欢的团队,可能是info_matches.team_id1或info_matches.team_id2或甚至两者。

下面是相关表小设计:

design

什么我试过,效果80%(所以它不会:(),因为它会返回一些用户正确的(他们最爱。团队3 +目标差异),但也返回用户在这种情况下没有一个团队。我认为他们返回,因为他们已经为一个团队或其他团队赢得了3球以上的差异

这是我的查询:

 
SELECT DISTINCT 
    f.id 
FROM 
    fanusers f 
LEFT JOIN 
    checkins c ON f.id = c.fanuser_id 
LEFT JOIN 
    info_matches m ON m.id = c.match_id 
WHERE 
    c.ctype = 'live' AND 
(
     m.team_id1 IN(
       SELECT DISTINCT 
        m1.team_id1 
       FROM 
        info_matches m1 
       RIGHT JOIN 
             fanusers_teams ft ON m1.team_id1 = ft.team_id 
       RIGHT JOIN 
             fanusers f ON f.id = ft.fanuser_id 
       WHERE 
        m1.pointsteam1 - m1.pointsteam2 >= 3 
       ) 
     OR 

     m.team_id2 IN(
       SELECT DISTINCT 
        m2.team_id2 
        FROM 
        info_matches m2 
       RIGHT JOIN 
             fanusers_teams ft ON m2.team_id2 = ft.team_id 
       RIGHT JOIN 
             fanusers f ON f.id = ft.fanuser_id 
       WHERE 
        m2.pointsteam2 - m2.pointsteam1 >= 3 
       ) 
) 

如果有人成功解决了这个问题,我也会很感激一个关于我做错了什么的小解释。

谢谢。

+0

跳到我身上的是左派加入你从粉丝用户到签到;你绝对不希望这样,因为你*只需要*已经登记游戏的用户。我会在你的分析中开始,看看有没有其他的OUTER连接应该是INNER。 – coyotesqrl

回答

2

像这样的东西应该工作:

SELECT DISTINCT f.id 

FROM fanusers f 

     JOIN checkins c 
     ON f.id = c.fanuser_id 

     JOIN fanusers_teams ft 
     ON f.id = ft.fanuser_id 

     JOIN info_matches m 
     ON m.id = c.match_id 
     AND 
     (
      (ft.team_id = m.team_id1 AND pointsteam1 - pointsteam2 >= 3) 
     OR 
      (ft.team_id = m.team_id2 AND pointsteam2 - pointsteam1 >= 3) 
     ) 

WHERE c.ctype = 'live' 
+0

对不起,只做了几个修改。 – Tom

+0

好的,对不起,编辑完成。 – Tom

+0

非常优雅,不需要任何解释。谢谢。 – mgm

0

我还找到了一种方法,解决了查询,但不是很好汤姆做到了。

我的方式:

 

SELECT DISTINCT 
          f.id AS user_id 
         FROM 
          fanusers f 
         LEFT JOIN 
          checkins c ON f.id = c.fanuser_id 
         LEFT JOIN 
          info_matches m ON m.id = c.match_id 
         WHERE 
          c.ctype = 'live' 
          AND 
          m.matchisfinished = 1 
          AND 
          c.fanuser_id NOT IN (SELECT DISTINCT 
                      f1.id 
                     FROM 
                      fanusers f1 
                     LEFT JOIN 
                      fanusers_stickers fs 
                     ON f1.id = fs.fanuser_id 
                     WHERE 
                      fs.sticker_id = 35 
                    ) 
          AND 
          (
           (m.team_id1 IN ( SELECT DISTINCT 
                       ft.team_id 
                      FROM 
                       fanusers_teams ft 
                      INNER JOIN 
                       checkins c1 
                      ON 
                       ft.fanuser_id = c1.fanuser_id 
                      WHERE 
                       f.id = c1.fanuser_id 
                    ) 
             AND 
             m.pointsteam1-m.pointsteam2>=3 
            ) 

            OR 

            (
             m.team_id2 IN ( SELECT DISTINCT 
                        ft.team_id 
                       FROM 
                        fanusers_teams ft 
                       INNER JOIN 
                        checkins c1 
                       ON 
                        ft.fanuser_id = c1.fanuser_id 
                       WHERE 
                        f.id = c1.fanuser_id 
                     ) 
              AND 
              m.pointsteam2-m.pointsteam1>=3 
            ) 
          ) 

所以,就目前而言,即使我很高兴,我已经自己解决了查询,我将使用汤姆的查询:)。