3

前回の問題の補足として、データベースに 2 つのテーブルがあり、特定の情報を抽出したいと考えています。以下の表:

   (player): player_id (primary), playerName
    (match): match_id (primary), playerID1, playerID2, playerID3, scorer etc..

プレイヤーの名前を取得するために、次のコードを提供していただきました。

SELECT p.Name 
FROM `match` m
INNER JOIN `player` p 
    ON p.player_id IN (m.playerID1, m.playerID2, m.playerID3) //etc

おかげで美しく動作します - 私がしたいのは2つの調整だけです:

  1. スコアラーの名前とプレーヤーの名前を返したいと思います。m.scorer は ID であるため、p.Name が既に m.playerID にマップされている場合、p.Name 属性にマップするにはどうすればよいですか?
  2. 上記のクエリは、すべてのプレーヤーの名前を返します。特定のプレーヤーのすべての試合を検索する検索機能をまもなく追加します。結果からそのプレーヤーを除外する方法はありますか (このプレーヤーが検索されたときに、このプレーヤーが試合に参加していたことは既にわかっているため)。そのため、ほぼすべての試合と特定のプレーヤーの仲間のプレーヤーを返しますが、実際に検索されたプレーヤーは結果から除外します。これが不明な場合は申し訳ありませんが、お知らせください。詳しく説明します。
4

1 に答える 1

3

次のようなものを試してください (フィールド名を想定して)。プレーヤーの名前、その試合の matchId、その試合で得点したかどうかが表示されます :)。

SELECT p.Name as 'Player Name', m.matchId as 'Match Id',
CASE s.scorerId WHEN ISNULL(S.SCORERID,0) THEN 'YES' ELSE 'NO' END as 'Scored?',
s.name as 'Scorer Name' --as requested from comment
FROM match m
INNER JOIN player p ON p.player_id IN (m.playerID1, m.playerID2, m.playerID3)
LEFT JOIN scorer s ON s.matchId = m.matchId
    AND s.player_id IN (m.playerID1, m.playerID2, m.playerID3)

この SQLFiddle HEREを参照してください

于 2012-05-25T14:07:25.013 に答える