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

Posted

技术标签:

【中文标题】MYSQL查询排除特定条件下的记录【英文标题】:MYSQL query to exclude records in specific condition 【发布时间】:2014-05-08 03:35:44 【问题描述】:

嘿,我有以下 mysql DB 结构,用于 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 这个页面有两个下拉列表

    所有用户列表 所有汽车的列表

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

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

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

【问题讨论】:

你没有说清楚,至少对我来说是这样。你能编辑你的问题,提供样本数据和期望的结果吗? @GordonLinoff 问题已编辑 【参考方案1】:

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

SELECT ID, UID FROM Users_cars GROUP BY UID

适用于所有汽车:

SELECT ID, CID FROM Users_cars GROUP BY CID

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

【讨论】:

【参考方案2】:

希望我能正确理解您的问题。

我认为你可以通过一些编程来做到这一点 -

使用 PHP/mysql -

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

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

【讨论】:

【参考方案3】:
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(*)

【讨论】:

【参考方案4】:

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

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

但请注意,这是一个贪婪的请求(当然取决于表的大小),您最好在用户表上放置一个标志并在您的用户使用最后一辆可用的汽车(或批量)时更新这样您就不会太频繁地运行请求!

【讨论】:

是的,有嵌套的选择查询是我不推荐的。我喜欢有一个标志来指示用户是否已使用所有可用汽车的想法

以上是关于MYSQL查询排除特定条件下的记录的主要内容,如果未能解决你的问题,请参考以下文章

MySQL查询(未完结)

mysql中的慢查询会不会影响速度

mysql结果集筛选排序

MYSQL 查询重复数据

MYSQL 查询重复数据

MySql单表查询