2011-02-08 72 views
0

我有一張門票表,需要選擇一個特定用戶沒有關聯的門票的唯一列表。我不能說「WHERE user_id!= 10」,因爲GROUP BY語句會影響返回哪個user_id。MySQL分組通過問題

最後,我正在使用MySQL數據庫。

SELECT * FROM tickets; 
+----+---------+--------+ 
| id | user_id | ticket | 
+----+---------+--------+ 
| 1 |  10 | T12345 | 
| 2 |  11 | T23456 | 
| 3 |  12 | T34567 | 
| 4 |  10 | T34567 | 
| 5 |  13 | T45678 | 
+----+---------+--------+ 

SELECT * FROM tickets WHERE user_id != 10 GROUP BY ticket; 
+----+---------+--------+ 
| id | user_id | ticket | 
+----+---------+--------+ 
| 2 |  11 | T23456 | 
| 3 |  12 | T34567 | 
| 5 |  13 | T45678 | 
+----+---------+--------+ 

-- Needed result 
-- User #10 also worked with ticket T34567, 
-- so I do not want it listed in the results 
+----+---------+--------+ 
| id | user_id | ticket | 
+----+---------+--------+ 
| 2 |  11 | T23456 | 
| 5 |  13 | T45678 | 
+----+---------+--------+ 

有人可以幫我建立一個查詢來返回我需要的結果嗎?

謝謝!

回答

1

這應該做的伎倆:

SELECT * 
FROM tickets 
WHERE ticket NOT IN (SELECT ticket FROM tickets WHERE user_id = 10) 

這將選擇所有從售票臺的票不匹配的用戶(ID = 10)的門票。

GROUP BY子句旨在用於聚合查詢(如OrangeDog所述)。因此,舉例來說,如果你要找到用戶的一票的數量,你可以使用:

SELECT COUNT(*) AS tcnt, ticket 
FROM tickets 
GROUP BY ticket 

這將使你:

+------+--------+ 
| tcnt | ticket | 
+------+--------+ 
| 1 | T12345 | 
| 1 | T23456 | 
| 2 | T34567 | 
| 3 | T45678 | 
+------+--------+ 

因爲你沒有做這樣的事情在這裏,沒有必要。

0
SELECT * 
FROM tickets 
WHERE ticket NOT IN (SELECT ticket FROM tickets WHERE user_id = 10); 

GROUP BY是當你使用聚合函數(COUNTSUM,等。)。如果不是,它通常不會做任何有用的事情。

+0

重複的答案... – 2011-02-08 19:40:28