0

ゴルフ データベースのクエリを作成しようとしています。statisticID = 1を持っていて、p2sStatistic > 65も持ってstatisticID = 3いるプレイヤーを返す必要がありp2sStatistic > 295ます。
1つstatisticIDは走行距離、もう1つは精度などです。次のことを試しましたが、うまくいかず、オンラインで答えが見つからないようです。ビューを実行せずにこれを行うにはどうすればよいですか?

SELECT playerFirstName, playerLastName
FROM player2Statistic, player 
WHERE player.playerID=player2Statistic.playerID
AND player2Statistic.statisticID=statistic.statisticID
AND p2sStatistic.3 > 295
AND p2sStatistic.1 > 65; 

http://i.imgur.com/o8epk.png - db の写真

この 2 つの条件を満たすプレイヤーのリストを出力するだけです。

4

3 に答える 3

0

重複のないプレーヤーのリストについては、EXISTS準結合がおそらく最適です。

SELECT playerFirstName, playerLastName
FROM   player AS p 
WHERE EXISTS (
   SELECT 1
   FROM   player2Statistic AS ps 
   WHERE  ps.playerID = p.playerID
   AND    ps.StatisticID = 1
   AND    ps.p2sStatistic > 65
   )
AND EXISTS (
   SELECT 1
   FROM   player2Statistic AS ps 
   WHERE  ps.playerID = p.playerID
   AND    ps.StatisticID = 3
   AND    ps.p2sStatistic > 295
   );

列名とコンテキストは、提供されたスクリーンショットから派生しています。質問のクエリはそれを完全にはカバーしていません。
括弧に注意してください。演算子の優先順位に対処するために必要です。

これはおそらく高速です(重複はおそらく不可能です):

SELECT p.playerFirstName, p.playerLastName
FROM   player           AS p 
JOIN   player2Statistic AS ps1 USING (playerID)
JOIN   player2Statistic AS ps3 USING (playerID)
AND    ps1.StatisticID = 1
AND    ps1.p2sStatistic > 65
AND    ps3.StatisticID = 3
AND    ps3.p2sStatistic > 295;

RDBMS の極秘ブランドが SQL 標準をサポートしていない場合は、次のよう(USING (playerID)に置き換えON ps1.playerID = p.playerIDてください: 同じ効果があります。

関係分割の場合です。この関連する質問の下で、それに対処するためのさらに多くのクエリ手法を見つけてください: How to
filter SQL results in a has-many-through relationship

于 2012-12-07T22:11:07.357 に答える
0

statisticクエリにテーブルがありません。where条項に基づいて、それに参加する必要があります。

また、適切な結合構文を使用する必要があります。

次のバージョンは、「1」に対して 1 回、「3」に対して 1 回、統計テーブルに 2 回参加します。

SELECT distinct playerFirstName, playerLastName
FROM player2Statistic p2s join
     player p
     on p.playerId = p2s.playerId join
     statistic s3
     on s3.StatisticId = p2s.statistcId and
        s3.StatisticId = 3 join
     statistic s1
     on s1.StatisticId = p2s.statisticId and
        s1.StatisticId = 1
WHERE  (s3.statistic > 295 and s1.statistic > 65)
于 2012-12-07T22:06:58.597 に答える
0

統計テーブルに 2 回参加する必要があります。

SELECT playerFirstName, playerLastName
  FROM player p
  JOIN player2Statistic s1
    on p.playerID=s1.playerID and s1.statisticID = 1
  JOIN player2Statistic s3
    on p.playerID=s3.playerID and s1.statisticID = 3
 WHERE s1.p2sStatistic > 65 and s3.p2sStatistic > 295;
于 2012-12-07T22:09:26.967 に答える