2012-12-11 122 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 
            ) 
          ) 

所以,就目前而言,即使我很高興,我已經自己解決了查詢,我將使用湯姆的查詢:)。