2014-03-28 110 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

是的,有嵌套的選擇查詢是我不推薦的東西。我喜歡有一個標誌,表明用戶是否使用過所有可用的汽車 –