2011-02-08 69 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