2017-06-09 139 views
0

我試圖選擇一個用戶,該用戶沒有具有某個值的關聯記錄。用於選擇相關記錄不存在的記錄的高效SQL查詢

我有一個用戶模型,一個用戶has_one供稿,一個供稿has_many FeedTracks,一個FeedTrack belongs_to一個跟蹤。我只想選擇用戶沒有帶有特定TrackId的FeedTrack的用戶。

我正在使用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,這就是我的問題是什麼。我怎麼說,嘿,讓我的用戶在這個相關的記錄不存在。但是如果該記錄確實存在,請不要返回該用戶。

換句話說,如果該用戶有一個提要,並且具有該提名標識的提要軌道,則不返回該用戶。但是,如果沒有,請返回該用戶。

+1

好像你定義錯誤模式,如果用戶有一個飼料,飼料表應該有'user_id'列,而不是用戶表具有'feed_id'列。請張貼您的數據庫架構。 – Thanh

+0

很好,謝謝 – gattra

回答

0

您可以使用GROUP BYHAVING

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 

SELECTGROUP BY修改列需要。

0

嘗試

User.joins(feed: :feed_tracks) 
     .where('feed_tracks.track_id <> ?', unwanted_track_id) 
     .order('id desc') 
     .limit(1000) 
     .to_sql 
0

您應該使用not existst操作這樣

SELECT TOP 1000 * 
FROM Users u 
    LEFT JOIN Feeds f ON f.id = u.feed_id 
    LEFT JOIN FeedTracks ft ON ft.feed_id = f.id 
where not exists 
(select 1 
from FeedTracks ft1 
where ft1.feed_id = f.id 
    and ft1.track_id = <<track_id>>)