2015-05-09 46 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 
) 
相关问题