MYSQL查询排除特定条件下的记录


MYSQL query to exclude records in specific condition

嘿,我有以下MYSQL数据库结构的3表多对多关系。多个用户可以拥有多个汽车,多个用户可以拥有多个汽车,如下图所示:

ID | Name
---------
100|John
101|Smith
汽车

ID | Name
---------
50|BMW
60|Audi

Users_cars

ID | UID | CID
---------
1| 100 |50
2| 100 |60
3| 101 |60

我有一个页面users_cars。php这个页面有两个下拉列表

  1. 所有用户列表
  2. 所有汽车列表

在这个页面中,您可以从用户列表中选择一个用户,从汽车列表中选择一辆汽车,然后单击add插入到users_cars表中。

我想做的是从用户的下拉列表中排除所有的用户已经链接到所有可用的汽车从汽车表

在上面的例子中,用户的下拉列表将只有"Smith",因为"John"与所有可用的汽车(宝马,奥迪)相关联,如果"Smith"也拥有宝马,他将被排除在列表之外。我需要一个选择查询这个条件,我不想使用任何嵌套的选择查询来计数用户记录在users_cars表

如果我理解你需要在你的查询中使用GROUP BY之后的情况。选择所有用户:

SELECT ID, UID FROM Users_cars GROUP BY UID

和所有汽车:

SELECT ID, CID FROM Users_cars GROUP BY CID

这将对相同的结果进行分组,因此您只能获得每个用户的一个实例,或者每个汽车的一个实例。

我希望我没理解错你的问题。

我认为你可以使用一些编程来实现这个-

与PHP/mysql -

  1. 获取所有不同的汽车ID的计数
  2. 获取每个用户的汽车数量。(确保只列出唯一的汽车ID)

遍历所有用户,并在每个循环中比较上述两个用户,并排除符合此条件的用户。

SELECT *
FROM   users
WEHRE  id NOT IN (SELECT uid
                  FROM   (SELECT          uid, COUNT(cid), COUNT(*)
                          FORM            cars
                          LEFT OUTER JOIN users_cars ON cars.id = users_cars.cid
                          GROUP BY        uid
                          HAVING          COUNT(cid) = COUNT(*)

基本上,你要做的是(如果我理解你的问题):

SELECT UID  FROM Users_cars WHERE CID NOT IN (SELECT ID FROM Cars);

但是要小心,这是一个贪婪的请求(当然取决于表的大小),你最好在用户表上放一个标志,并在用户使用最后可用的车(或批处理)时更新它,这样你就不会太频繁地运行请求!