簡體   English   中英

SQL-使用其他表中的條件執行SELECT

[英]SQL - Perform SELECT with condition from another table

我有四個表: usergameuser_games_joineduser_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_ratinguser_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM