2015-05-09 71 views
-2

我有三個表,像這樣的結構:如何避免從一對多關係中獲取一行?

Trips: id 
Users: id 
users_has_trips: user_id, trips_id 

我當前的查詢:

SELECT trips.id 
FROM trips 
LEFT JOIN users_has_trips ON users_has_trips.trips_id = trips.id 
WHERE users_has_trips.users_id != '1' 

我想如果users_has_trips.users_id值被設置到一定不要選擇trip.id值(如1)。 users_has_trips對於users_has_trips.trips_id有多個具有相同值的行,所以當我消除具有不想要的users_id的行時,我仍然會顯示行。

例如,trip.id值爲1和2. users_has_trips列(trips_id,users_id)分別具有值(1,1),(1,2)和(1,3)。當我運行上面的查詢時,WHERE將消除(1,1)的行,但仍然會在行(1,2),(1,3)中獲取1的trips.id,並且還會2.

的期望的結果trips.id是不選擇trips.id值的1(因爲我users_id被與之相關聯),並且僅抓住trips.id 2.

+0

你是說你想選擇用戶1不屬於的一部分嗎? – AdamMc331

+0

您當前的查詢已排除'users_has_trips.user_id!='1''的行(儘管通常的語法是'<>'而不是'!=')。請發佈樣本數據,您希望從該數據中獲得的結果以及從當前查詢中獲得的錯誤結果。此外,你同時使用mysql和sql-server的可能性很小 - 請僅爲你使用的**特定的** DBMS添加標籤,而不要只添加那些看起來像他們包含熟悉的詞語。這裏的標籤具有特定的含義,並且由於語法和特徵差異,準確的DBMS非常重要。 –

+0

是的,我試圖選擇用戶1不是其中的一部分的所有旅行。但是因爲users_has_trips表顯示行程的許多行(與其他用戶一樣多次作爲行程的一部分),所以我遇到了麻煩不要看那些行。 – Kyle

回答

0
SELECT * 
FROM trips AS t 
WHERE t.id NOT IN 
(
    SELECT trip_id 
    FROM users_has_trips 
    WHERE user_id = '1' 
) 

值或者對您的問題進行改寫:

僅顯示給定用戶不存在行的行程:

SELECT * 
FROM trips AS t 
WHERE NOT EXISTS 
(
    SELECT * 
    FROM users_has_trips AS ut 
    WHERE ut.user_id = '1' 
    AND ut.trip_id = t.id 
) 
相關問題