1

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

用户

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

汽车

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

用户_汽车

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

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

  1. 所有用户的列表
  2. 所有汽车的清单

在此页面中,您可以从用户列表中选择用户并从汽车列表中选择汽车,然后单击添加以插入 users_cars 表。

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

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

4

4 回答 4

0

我希望我理解你的问题是正确的。

我认为您可以使用一些编程来做到这一点-

使用 PHP/mysql -

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

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

于 2014-03-28T15:29:36.137 回答
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(*)
于 2014-03-28T15:30:34.457 回答
0

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

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

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

于 2014-03-28T15:31:44.243 回答
0

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

SELECT ID, UID FROM Users_cars GROUP BY UID

对于所有汽车:

SELECT ID, CID FROM Users_cars GROUP BY CID

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

于 2014-03-28T15:25:37.543 回答