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

时间:2014-03-28 15:21:03

标签: php mysql inner-join select-query

嘿,我有3个具有多对多关系的表的MYSQL DB结构。许多用户可以拥有许多汽车,并且可以为许多用户提供汽车,如下所示:

用户

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. 所有车辆列表
  3. 在此页面中,您可以从用户列表中选择一个用户,然后从汽车列表中选择一辆汽车,然后点击添加以插入到users_cars表中。

    我们要做的是从用户的下拉列表中排除所有与汽车表中所有可用汽车相关联的用户。

    在上面的示例中,用户的下拉列表将只有“Smith”,因为“John”与所有可用的车辆(BMW,AUDI)相关联,如果“Smith”也有BMW,他将被排除在列表之外。我需要一个针对这种情况的选择查询,我不想使用任何嵌套选择查询来计算users_cars表中的用户记录

4 个答案:

答案 0 :(得分:0)

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

SELECT ID, UID FROM Users_cars GROUP BY UID

和所有汽车:

SELECT ID, CID FROM Users_cars GROUP BY CID

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

答案 1 :(得分:0)

我希望我理解你的问题。

我认为你可以使用一些编程 -

使用PHP / mysql -

  1. 计算所有不同的车牌ID
  2. 为每位用户计算汽车数量。 (确保仅列出唯一的车牌ID
  3. 遍历所有用户并在每个循环中比较上述两个并排除此条件匹配的用户。

答案 2 :(得分:0)

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(*)

答案 3 :(得分:0)

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

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

但仔细一点,这是一个贪婪的请求(当然取决于表的大小),你最好在用户表上放置一个标志,然后当你的用户使用最后一个可用的汽车(或批量)时更新所以你不经常运行请求!