2012-01-13 61 views
1

我有想出這種情況的工作查詢的麻煩......查詢設計與分組

表:

[ matchID ] [ User ] [ team ] 
    1   10  1 
    1   77  2 
    2   10  1 
    2   77  1 
    3   10  2 
    4   10  1 

注:

  • 有時對手是未知的,例如在比賽2,3和4中
  • 有時一個團隊有上側只有一個人,例如比賽1
  • 有時一個團隊具有n上的一側的人,例如比賽2

所需的查詢結果:

列表對於未知對手的給定用戶的matchID。

我第一次嘗試是:

SELECT matchID FROM table 
GROUP BY matchID 
HAVING COUNT(matchID) = 1 

但後來我意識到,我是不計算在有隊友,但未知的對手,如上述第2場比賽。

用簡單的英語,我需要得到所有matchIDs其中:

  • 涉及給定用戶< - 編輯追加
  • 每個人都在同一支球隊
  • 或只有一條人列出

但我不知道如何在一個查詢中有效地做到這一點。幫幫我?

+0

如何匹配1有「一邊用戶」? – davogotland 2012-01-13 00:44:22

+0

@davogotland「一個用戶*每個*方」,我想。 – 2012-01-13 00:45:01

+0

是的,在比賽1中,球隊1只有一名成員 - 用戶10 – Drew 2012-01-13 00:46:53

回答

2
SELECT MatchID 
    FROM Table 
GROUP BY MatchID 
HAVING COUNT(DISTINCT Team) = 1; 

你似乎需要那些只有一支球隊被記錄在表格的比賽,而這個查詢爲您提供了這些比賽。

如果比賽必須涉及特定用戶(10爲樣本數據),則:

SELECT t1.MatchID 
    FROM Table AS t1 
WHERE EXISTS(SELECT * 
       FROM Table AS t2 
       WHERE t2.UserID = 10 AND t1.MatchID = t2.MatchID) 
GROUP BY t1.MatchID 
HAVING COUNT(DISTINCT t1.Team) = 1; 

你也許可以做到這一點作爲一個(內)自聯接:

SELECT t1.MatchID 
    FROM Table AS t1 
    JOIN Table AS t2 ON t1.MatchID = t2.MatchID AND t2.UserID = 10 
GROUP BY t1.MatchID 
HAVING COUNT(DISTINCT t1.Team) = 1; 

或者,也許更清楚一些:

SELECT t1.MatchID 
    FROM Table AS t1 
    JOIN (SELECT MatchID FROM Table AS t2 WHERE t2.UserID = 10) AS t2 
    ON t1.MatchID = t2.MatchID 
GROUP BY t1.MatchID 
HAVING COUNT(DISTINCT t1.Team) = 1; 

子選擇選擇那些UserID 10播放的匹配項;其餘的工作像以前一樣。

+0

對不起,先生們,我忘了一個要求,在頂部,但從問題的底部忽略,請參閱編輯 – Drew 2012-01-13 00:56:30

1

你可以統計每場比賽的球隊數量。如果只有一個那麼有沒有足夠的:

SELECT matchID 
FROM table 
GROUP BY matchID 
HAVING COUNT(DISTINCT(team))=1; 
+0

偉大的思想人士都認爲 - 我們不能都是錯的,我們可以嗎? – 2012-01-13 00:49:35

+1

哈哈,最後的話! :) – 2012-01-13 00:53:14

+0

對不起,先生們,我忘了一個要求。位於頂部,但從問題的底部忽略。請參閱編輯。 – Drew 2012-01-13 00:56:50

0

您還沒有提供表名,所以我決定將它稱爲mut,因爲這是匹配用戶團隊的簡稱。無論如何,這似乎是在所有情況下工作:

SELECT DISTINCT 
    `matchID` 
FROM 
    `mut` 
WHERE 
    `user`=10 
AND 
    `matchID` NOT IN (
     SELECT 
      `m1`.`matchID` 
     FROM 
      `mut` AS `m1` 
     INNER JOIN 
      `mut` AS `m2` 
     ON 
      `m1`.`matchID`=`m2`.`matchID` 
     AND 
      `m1`.`team`<>`m2`.`team` 
    ) 
+0

哎呀,那個人有一個錯誤,現在編輯它,我還添加了一行:'匹配2,使用者30,隊伍2,這使得隊伍1中有2名隊員和隊伍2中的1名隊員在比賽2中。所以新的隊員30和好的隊員77沒有與未知對手的比賽,隊員10在比賽3和4中有不知名的對手。沒有那一排,球員77在比賽2中有未知的對手。 – davogotland 2012-01-13 01:15:54

+0

SQL的十行足夠的SQL似乎不必要地浪費在垂直空間上,並且(對我的眼睛)妨礙了SQL的可讀性 – 2012-01-13 01:29:23

+0

這似乎是掃描表3次(對於每個FROM或JOIN一次),這可能比僅這樣做兩次效率更低。 – 2012-01-13 01:31:39