2つの同一のサブクエリによって取得された値を再利用するにはどうすればよいですか?

アレクサンダーファーバー

質問用に簡単なSQLフィドル用意しました

PostgreSQL 10には、ユーザーIDとユーザーソーシャルネットワークデータ(名前、写真など)を保持する2つのテーブルがあります。

CREATE TABLE words_users (
        uid     SERIAL PRIMARY KEY
);

CREATE TABLE words_social (
        sid     text     NOT NULL,
        social  integer  NOT NULL CHECK (0 < social AND social <= 64),
        given   text     NOT NULL CHECK (given ~ '\S'),
        uid     integer  NOT NULL REFERENCES words_users ON DELETE CASCADE,
        PRIMARY KEY(sid, social)
);

そして、ゲームとチャットメッセージを保持する2つのテーブルがあります:

CREATE TABLE words_games (
        gid SERIAL PRIMARY KEY,
        player1 integer REFERENCES words_users(uid) ON DELETE CASCADE NOT NULL CHECK (player1 <> player2),
        player2 integer REFERENCES words_users(uid) ON DELETE CASCADE
);

CREATE TABLE words_chat (
        cid     BIGSERIAL PRIMARY KEY,
        created timestamptz NOT NULL,
        gid     integer NOT NULL REFERENCES words_games ON DELETE CASCADE,
        uid     integer NOT NULL REFERENCES words_users ON DELETE CASCADE,
        msg     text    NOT NULL
);

ここで、テーブルにテストデータを入力します。

  • Facebookのuid = 1およびsid = "1111"のユーザー「Alice」(social = 10)
  • Googleのuid = 2およびsid = "2222"のユーザー "Bob"(social = 20)
  • 両方のユーザーがチャットするgid = 100のゲーム

SQL:

INSERT INTO words_users (uid) VALUES (1), (2);

INSERT INTO words_games (gid, player1, player2) VALUES (100, 1, 2);

INSERT INTO words_social (sid, social, given, uid) VALUES 
('1111', 10, 'Alice', 1), 
('2222', 20, 'Bob', 2);

INSERT INTO words_chat (created, gid, uid, msg) VALUES 
(now() + interval '1 min', 100, 2, 'Hello, Alice'), 
(now() + interval '2 min', 100, 1, 'Hello, Bob'), 
(now() + interval '3 min', 100, 2, 'Nice to see you, Alice'), 
(now() + interval '4 min', 100, 1, 'Nice to see you too, Bob'), 
(now() + interval '5 min', 100, 2, 'Goodbye, Alice'), 
(now() + interval '6 min', 100, 1, 'Goodbye, Bob'); 

私はPHPスクリプトを作成しようとしています。このスクリプトは、sidsocial、およびgid与えられると、ゲームgidの完全なチャットを返します。

他のユーザーがプレイしていないゲームをスパイしたくないので、チャットをフェッチして表示するためだけにgidパラメーターを使用するのではありません。

また、uidパラメーターを使用してスクリプトを呼び出すユーザーを識別することはできません。代わりにsidパラメーターsocialパラメーターを使用する必要があります(さらに、上記のテストケースから省略したシークレット)。

チャットをフェッチするためのSQLステートメントは次のとおりです。

SELECT uid, msg 
FROM words_chat 
WHERE gid=100 
AND EXISTS (select 1 from words_games where 
   (select uid from words_social 
   where sid='1111' and social=10) in (player1, player2)) 
ORDER BY CREATED ASC;

スクリーンショット

それは機能しますが、もう1つ必要なため、複雑になります。チャットメッセージごとに、「アリス」によるメッセージかどうかを知るために(uidではなくブール値が必要です(その線を引くことができます)。太字)。

だから私はこれをやろうとしていますが、SQLステートメントはさらに醜くなります:

SELECT uid=(select uid from words_social 
   where sid='1111' and social=10) AS mine, msg 
FROM words_chat 
WHERE gid=100 
AND EXISTS (select 1 from words_games where 
   (select uid from words_social 
   where sid='1111' and social=10) in (player1, player2)) 
ORDER BY CREATED ASC;

スクリーンショット2

上のスクリーンショットでわかるように、これは機能しますが、このクエリを改善するにはどうすればよいですか?

SQLに2番目のサブクエリでuidを再利用する方法はありますか(つまり、PHPスクリプトにuidを保存したくない、またはpl / pgSQLを使用したくない)

ゴードン・リノフ

これは、joinsの使用について考えるのが非常に簡単です

select wc.*, (wc.uid = ws.uid) as mine
from words_chat wc join
     words_games wg
     on wc.gid = wg.gid join
     words_social ws
     on ws.uid in (wg.player1, player2)
where wc.gid = 100 and
      ws.sid = '1111' and
      ws.social = 10
order by created asc;

これがSQLフィドルです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

サブクエリを使用して2つのテーブルから値を取得するにはどうすればよいですか?

分類Dev

select式内でサブクエリを再利用するにはどうすればよいですか?

分類Dev

サブクエリを使用して返された列値のカウントを取得するにはどうすればよいですか?

分類Dev

(2つのサブクエリによって生成された)2つの列の間で異なる要素を見つけるにはどうすればよいですか?

分類Dev

SELECTクエリmysqlの2つの値を比較して一般的でない値を取得するにはどうすればよいですか?

分類Dev

JLabelクリックによって動的に作成されたJavaのJTextFieldから値を取得するにはどうすればよいですか?

分類Dev

Linqクエリによって取得されたすべてのJQueryデータ列をDiv要素に追加するにはどうすればよいですか?

分類Dev

SSMSの2つの異なるクエリによって取得された値からパーセンテージを計算するにはどうすればよいですか?

分類Dev

2つのObservable(RxJava)間でサブスクライバーを再利用するにはどうすればよいですか?

分類Dev

サブクエリのWHERE句内で変数を再利用するにはどうすればよいですか?

分類Dev

4storeでSPARQLサブクエリの結果を再利用するにはどうすればよいですか?

分類Dev

SQLクエリによって返された値をSQLSERVERの複数の列に分割するにはどうすればよいですか?

分類Dev

mysqlで単一のクエリを使用して2つのテーブルからデータを取得するにはどうすればよいですか?

分類Dev

SQLクエリのCOUNT(*)が複数の値を返すのはなぜですか?見つかった行の総数に対して単一の値を取得するにはどうすればよいですか?

分類Dev

SQLクエリで、別のテーブルからクエリされた値を持つ列を作成するにはどうすればよいですか?

分類Dev

CodeIgniter:2つのクエリが統合されたときに発生する「非オブジェクトのプロパティを取得しようとしています」エラーを修正するにはどうすればよいですか?

分類Dev

2つの結合をサブクエリするにはどうすればよいですか?

分類Dev

Tomcatサーバーによって処理されたリクエストの総数を確認するにはどうすればよいですか?

分類Dev

別のクエリによって返されたテーブル名から選択を実行するにはどうすればよいですか?

分類Dev

Mysql - 2 つのクエリによって返された行数を差し引くにはどうすればよいですか

分類Dev

2つまたは3つ以上のクエリから結合された出力を取得するにはどうすればよいですか?

分類Dev

golangのクエリ文字列に入力されたデータに従ってデータを取得するにはどうすればよいですか?

分類Dev

Djangoで、サブクエリのサブクエリに基づいてレコードの数を取得するにはどうすればよいですか?

分類Dev

クエリ結果をクラスにキャッシュし、C#のメソッドで渡されたパラメーターに基づいて検索するために再利用するにはどうすればよいですか?

分類Dev

1行のリスト内包によって作成されたリストに単一の値を追加するにはどうすればよいですか?

分類Dev

javascriptを使用してエンコードされたURLからクエリ文字列の値を取得するにはどうすればよいですか?

分類Dev

クリックされたボタンの値を取得するにはどうすればよいですか?

分類Dev

リポジトリメソッドでJOOQクエリの一部を再利用/作成するにはどうすればよいですか?

分類Dev

クエリのすべての値を取得するにはどうすればよいですか?

Related 関連記事

  1. 1

    サブクエリを使用して2つのテーブルから値を取得するにはどうすればよいですか?

  2. 2

    select式内でサブクエリを再利用するにはどうすればよいですか?

  3. 3

    サブクエリを使用して返された列値のカウントを取得するにはどうすればよいですか?

  4. 4

    (2つのサブクエリによって生成された)2つの列の間で異なる要素を見つけるにはどうすればよいですか?

  5. 5

    SELECTクエリmysqlの2つの値を比較して一般的でない値を取得するにはどうすればよいですか?

  6. 6

    JLabelクリックによって動的に作成されたJavaのJTextFieldから値を取得するにはどうすればよいですか?

  7. 7

    Linqクエリによって取得されたすべてのJQueryデータ列をDiv要素に追加するにはどうすればよいですか?

  8. 8

    SSMSの2つの異なるクエリによって取得された値からパーセンテージを計算するにはどうすればよいですか?

  9. 9

    2つのObservable(RxJava)間でサブスクライバーを再利用するにはどうすればよいですか?

  10. 10

    サブクエリのWHERE句内で変数を再利用するにはどうすればよいですか?

  11. 11

    4storeでSPARQLサブクエリの結果を再利用するにはどうすればよいですか?

  12. 12

    SQLクエリによって返された値をSQLSERVERの複数の列に分割するにはどうすればよいですか?

  13. 13

    mysqlで単一のクエリを使用して2つのテーブルからデータを取得するにはどうすればよいですか?

  14. 14

    SQLクエリのCOUNT(*)が複数の値を返すのはなぜですか?見つかった行の総数に対して単一の値を取得するにはどうすればよいですか?

  15. 15

    SQLクエリで、別のテーブルからクエリされた値を持つ列を作成するにはどうすればよいですか?

  16. 16

    CodeIgniter:2つのクエリが統合されたときに発生する「非オブジェクトのプロパティを取得しようとしています」エラーを修正するにはどうすればよいですか?

  17. 17

    2つの結合をサブクエリするにはどうすればよいですか?

  18. 18

    Tomcatサーバーによって処理されたリクエストの総数を確認するにはどうすればよいですか?

  19. 19

    別のクエリによって返されたテーブル名から選択を実行するにはどうすればよいですか?

  20. 20

    Mysql - 2 つのクエリによって返された行数を差し引くにはどうすればよいですか

  21. 21

    2つまたは3つ以上のクエリから結合された出力を取得するにはどうすればよいですか?

  22. 22

    golangのクエリ文字列に入力されたデータに従ってデータを取得するにはどうすればよいですか?

  23. 23

    Djangoで、サブクエリのサブクエリに基づいてレコードの数を取得するにはどうすればよいですか?

  24. 24

    クエリ結果をクラスにキャッシュし、C#のメソッドで渡されたパラメーターに基づいて検索するために再利用するにはどうすればよいですか?

  25. 25

    1行のリスト内包によって作成されたリストに単一の値を追加するにはどうすればよいですか?

  26. 26

    javascriptを使用してエンコードされたURLからクエリ文字列の値を取得するにはどうすればよいですか?

  27. 27

    クリックされたボタンの値を取得するにはどうすればよいですか?

  28. 28

    リポジトリメソッドでJOOQクエリの一部を再利用/作成するにはどうすればよいですか?

  29. 29

    クエリのすべての値を取得するにはどうすればよいですか?

ホットタグ

アーカイブ