我正在尝试选择一个用户,其中该用户没有具有特定值的关联记录。
我有一个用户模型,一个用户has_one Feed,一个Feed has_many FeedTracks,一个FeedTrack属于一个Track。我想只选择没有FeedTrack且具有某个TrackId的用户。
我正在使用rails但我会接受严格的SQL。
我得到的最好的是:
SELECT TOP 1000 *
FROM Users u
LEFT JOIN Feeds f ON f.user_id = u.id
LEFT JOIN FeedTracks ft ON ft.feed_id = f.id
ONLY IF ALL OF THOSE feedTracks' track_id !== <<track_id>>
显然,最后一部分语句不是真正的SQL,这就是我的问题。我怎么说,嘿,告诉我这个相关记录不存在的用户。但如果该记录确实存在,请不要返回该用户。
换句话说,如果该用户有一个Feed,其中包含该轨道ID的Feed轨道,请不要返回该用户。但如果没有,请返回该用户。
答案 0 :(得分:0)
您可以使用GROUP BY
和HAVING
:
SELECT u.id
FROM Users u
LEFT JOIN Feeds f
ON f.id = u.feed_id
LEFT JOIN FeedTracks ft
ON ft.feed_id = f.id
GROUP BY u.id
HAVING
SUM(CASE WHEN ft.track_id = @track_id THEN 1 ELSE 0 END) = 0
根据需要修改SELECT
和GROUP BY
中的列。
答案 1 :(得分:0)
尝试
User.joins(feed: :feed_tracks)
.where('feed_tracks.track_id <> ?', unwanted_track_id)
.order('id desc')
.limit(1000)
.to_sql
答案 2 :(得分:0)
您应该像这样使用appendChild()
操作
insertBefore()