2016-04-05 12 views
0

私は4つのテーブル:user,game,user_games_joinedおよびuser_ratingを持っています。彼らは与えた前回(すなわちuser_games_joined表は、同じゲームのために、ユーザーごとに行が含まれています)SQL - 別のテーブルの条件でSELECTを実行します

ユーザーが別のユーザーのための「評価」を与えるかもしれないが、彼らはそのユーザにゲームをプレイしている場合にのみそのユーザーの評価はです。

ユーザーが現在別の特定のユーザーに評価を与えることが許可されているかどうかを示す単一のSELECTステートメントを作成しようとしています。ここで私がこれまで持っているものです。この文は0を返し

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]; 

場合は、最終的な答えは、です。 else true(最後の評価が与えられてから2人のユーザーの間で少なくとも1つのゲームがプレイされています)。問題は[DATE_OF_MOST_RECENT_RATING]は不明です:user_ratingテーブルから決定する必要があります。私は2つの別々のクエリでこのタスクを達成することができ

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; 

もちろんので、しかし、明白な理由のために私は、単一の文の中にそれを組み合わせるしたいと思います。ここでは、情報のその部分を問い合わせるかもしれない方法です。誰かがこれで私を助けることができますか?ありがとう!

EDIT:ボーナスポイントのために、誰かが同様user_ratingテーブルにINSERT中にこのチェックを実行する方法を考え出すことができるので、検証はINSERTの前に別のクエリとして発生する必要はないのですか?あなたのDBた私は知らないので、

select (max(ur.rating_date) < max(g.date)) 
+0

構文でMySQLが示唆されているため、Oracleタグを削除しました。 –

答えて

0

は、これはかなり複雑セットです使っている。私はこれをテストしなかったのでどちらかのエラーが出るかもしれませんが、あなたは下からその要点を得るべきです。

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]; 
         ); 
+0

'from user_rating ur'の後に' join'がなければなりません(行4)?そして 'on.game_uuid'は' on ufrom.game_uuid'でなければなりません(11行目)? – hundley

+0

それはうまく動作しませんが、私は理由を理解できないようです。以前のコメントから2つの変更を加えましたが、それは元々の意味であると仮定していましたが、データが「はい」を返すことを確認したにもかかわらず、「いいえ」を返します。 – hundley

+0

@hundley。 。 。私はすべてが間違っています。私は彼らが今より良いと思う。 –

0

一般的なクエリを書く:あなたの目的のために

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よりよい:いくつかの凝集に参加するの

関連する問題