2014-03-28 71 views
1

嘿,我有以下MYSQL数据库结构3个表与多对多的关系。许多用户可以有很多的汽车和汽车可能是许多用户,如下显示:MYSQL查询排除特定条件下的记录

用户

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. 列表

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

我想要做的是从用户的下拉列表中排除所有与汽车表中所有可用汽车链接的用户。

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

+0

你还没有说清楚,至少对我而言。你能编辑你的问题,提供样本数据和期望的结果吗? –

+0

@GordonLinoff问题已编辑 –

回答

0

如果我明白你在你需要在你的查询中使用GROUP BY后是什么。因此,要选择所有用户:

SELECT ID, UID FROM Users_cars GROUP BY UID 

,并为所有汽车:

SELECT ID, CID FROM Users_cars GROUP BY CID 

这将组的结果都是一样的,所以你只能得到每个用户的一个实例,或每节车厢的一个实例。

0

我希望我能理解你的问题。

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

使用PHP/MySQL的 -

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

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

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

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

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

但是小心,这是一个贪婪的请求(取决于课程表的大小)并且最好在用户表上放置一个标志,然后在用户使用最后一个可用车(或批次)时进行更新,以免太频繁地运行请求!

+0

是的,有嵌套的选择查询是我不推荐的东西。我喜欢有一个标志,表明用户是否使用过所有可用的汽车 –