[英]SQL - Perform SELECT with condition from another table
我有四個表: user
, game
, user_games_joined
和user_rating
。
一個用戶可以給另一個用戶一個“評分”,但是僅當他們與該用戶一起玩過游戲時(即user_games_joined
表包含同一游戲的每個用戶的行),是自他們上次為該用戶評分以來 。
我正在嘗試構建一個SELECT語句,該語句將告訴我們當前是否允許某個用戶為另一個特定用戶提供評級。 這是我到目前為止的內容:
SELECT COUNT(*)
FROM user_games_joined from_joined
LEFT JOIN game ON from_joined.game_uuid = game.uuid
INNER JOIN user_games_joined to_joined ON from_joined.game_uuid = to_joined.game_uuid
WHERE from_joined.user_uuid = [USER_GIVING_RATING_UUID]
AND to_joined.user_uuid = [USER_RECEIVING_RATING_UUID]
AND game.date > [DATE_OF_MOST_RECENT_RATING];
如果該語句返回0
,則最終答案為false ; 否則為true (自給出最新評級以來,兩個用戶之間至少玩過一次游戲)。 問題在於[DATE_OF_MOST_RECENT_RATING]是未知的:必須從user_rating
表中確定。 這就是我們查詢該信息的方式:
SELECT date from user_rating
WHERE to_user_uuid = [USER_RECEIVING_RATING_UUID]
AND from_user_uuid = [USER_GIVING_RATING_UUID]
ORDER BY date DESC LIMIT 1;
因此,我當然可以通過兩個單獨的查詢來完成此任務,但是出於明顯的原因,我想將其合並為一個語句。 有人可以幫我這個忙嗎? 謝謝!
編輯:對於加分,有人可以想出一種方法在INSERT期間user_rating
在user_rating
表中執行此檢查,因此驗證不需要在INSERT之前作為單獨的查詢發生?
這是一組帶有一些聚合的相當復雜的聯接:
select (case when coalesce(max(ur.rating_date), max(g.date)) <= max(g.date) then 'Go and Rate'
else 'No, no, no. Go and play'
end)
from user_game g join
user_games_joined ufrom
on ufrom.game_uuid = g.uuid and
ufrom.user_uuid = g.from_user_uuid join
user_games_joined uto
on uto.game_uuid = g.uuid and
uto.user_uuid = g.to_user_uuid left join
user_rating ur join
on ur.from_user_uuid = ufrom.user_uuid and
ur.to_user_uuid = uto.user_uid
where to_user_uuid = [USER_RECEIVING_RATING_UUID] and
from_user_uuid = [USER_GIVING_RATING_UUID];
為了您的目的,一個更好的select
是:
select (max(ur.rating_date) < max(g.date))
由於不知道您正在使用哪個數據庫,因此編寫了一個通用查詢。 我也沒有對此進行測試,因此可能會有一些錯誤,但是您應該從下面獲得要點。 您可能需要調整查詢的語法和性能:
INSERT INTO user_rating
SELECT new_rating FROM DUAL
WHERE EXISTS (
SELECT 1 --selecting 1 IS FASTER THAN COUNT(*)
FROM user_games_joined from_joined
LEFT JOIN game
ON from_joined.game_uuid = game.uuid
INNER JOIN user_games_joined to_joined
ON from_joined.game_uuid = to_joined.game_uuid
INNER JOIN user_rating XX
ON XX.to_user_uuid = to_joined.user_uuid
AND XX.from_user_uuid = from_joined.user_uuid
AND Game.date > XX.date
WHERE from_joined.user_uuid = [USER_GIVING_RATING_UUID]
AND to_joined.user_uuid = [USER_RECEIVING_RATING_UUID]
AND game.date > [DATE_OF_MOST_RECENT_RATING];
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.