嘿,我有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此页面有两个下拉列表
在此页面中,您可以从用户列表中选择一个用户,然后从汽车列表中选择一辆汽车,然后点击添加以插入到users_cars表中。
我们要做的是从用户的下拉列表中排除所有与汽车表中所有可用汽车相关联的用户。
在上面的示例中,用户的下拉列表将只有“Smith”,因为“John”与所有可用的车辆(BMW,AUDI)相关联,如果“Smith”也有BMW,他将被排除在列表之外。我需要一个针对这种情况的选择查询,我不想使用任何嵌套选择查询来计算users_cars表中的用户记录
答案 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 -
遍历所有用户并在每个循环中比较上述两个并排除此条件匹配的用户。
答案 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);
但仔细一点,这是一个贪婪的请求(当然取决于表的大小),你最好在用户表上放置一个标志,然后当你的用户使用最后一个可用的汽车(或批量)时更新所以你不经常运行请求!