2

私は投票テーブルを持っています:

 votes
-----------------
 userid   gameid
-------  --------
   a        1
   a        2
   a        3
   b        1
   b        2

そしてゲームテーブル:

 games
----------------
 gameid   title
 ------   ------
    1       foo
    2       bar
    3       fizz
    4       buzz

「[ユーザー A がゲームに投票した] のゲームから * を選択」というクエリを実行するには、どのような結合を使用しますか?

Jeff のガイドに従ってみましたが、期待した結果が得られません。

4

4 に答える 4

6

結合を使用して、共通フィールドINNER間の関係を確立します。gameid

select
  votes.userid,
  games.title
from games
  inner join votes on (votes.gameid = game.gameid)
where
  votes.userid = 'a'
于 2011-08-11T22:37:31.957 に答える
1

これにより、投票のあるゲームが得られます。

SELECT
   g.title
   v.userid
FROM
   games g

   INNER JOIN votes v
   ON g.gameid = v.gameid

これにより、投票されていない場合でも、すべてのゲームが取得されます。

SELECT
   g.title
   v.userid
FROM
   games g

   LEFT JOIN votes v
   ON g.gameid = v.gameid
于 2011-08-11T22:38:18.810 に答える
1

必要な関係演算子はsemijoinです。

ほとんどの SQL 製品には、明示的な準結合演算子またはキーワードがありません。標準 SQL-92 にはMATCH (subquery)述語がありますが、広く実装されているわけではありません (真のリレーショナル言語のチュートリアル DMATCHINGでは、セミジョイン演算子にキーワード theが使用されています)。

もちろん、セミジョインは他の SQL 述語を使用して記述できます。最も一般的に見られる使用EXISTSまたはIN (subquery).

データによっては使える場合もありますSELECT DISTINCT..INNER JOIN。ただし、あなたのケースではSELECT * FROM ...INNER JOIN投票テーブルに投影され、その結果userid、重複列とともに列リストに追加されgameidます(選択したSQL製品がそれをサポートしている場合、使用NATURAL JOINすると重複列の問題が解決され、ON句も省略します)。

お使いINTERSECTの SQL 製品がサポートしている場合は、別の方法として使用することもできます。また、データによっては (具体的には、2 つのテーブルの見出しが同じ場合)>

個人的にはEXISTS、SQL でセミジョインを使用することを好みます。これは、結合句が記述されたコード内でより近くにあり、結合されたテーブルに対するプロジェクションが発生しないためです。

SELECT *
  FROM games
 WHERE EXISTS (
               SELECT * 
                 FROM votes AS v
                WHERE v.gameid = games.gameid
                      AND v.userid = 'a'
              );
于 2011-08-12T07:29:25.907 に答える
0

説明が限られていることを考えると、ユーザーAがゲームに投票したゲームのリストは次のようになります。

select g.gameid, g.title
from games g
inner join votes v
on v.gameid = g.gameid
where v.userid = 'a'
于 2011-08-11T22:45:11.857 に答える