如何避免从一对多关系中获取一行?
问题描述:
我有三个表,像这样的结构:如何避免从一对多关系中获取一行?
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.
答
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
)
你是说你想选择用户1不属于的一部分吗? – AdamMc331
您当前的查询已排除'users_has_trips.user_id!='1''的行(尽管通常的语法是''而不是'!=')。请发布样本数据,您希望从该数据中获得的结果以及从当前查询中获得的错误结果。此外,你同时使用mysql和sql-server的可能性很小 - 请仅为你使用的**特定的** DBMS添加标签,而不要只添加那些看起来像他们包含熟悉的词语。这里的标签具有特定的含义,并且由于语法和特征差异,准确的DBMS非常重要。 –
是的,我试图选择用户1不是其中的一部分的所有旅行。但是因为users_has_trips表显示行程的许多行(与其他用户一样多次作为行程的一部分),所以我遇到了麻烦不要看那些行。 – Kyle