0

我正在尝试为高尔夫数据库编写查询。statisticID = 1它需要返回有ap2sStatistic > 65和也有statisticID = 3的玩家p2sStatistic > 295
一个statisticID是行驶距离,另一个是准确性等。我尝试了以下方法,但它不起作用,似乎无法在网上找到答案。如果不进行视图,我将如何处理?

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 的图片

试图得到它只是输出满足这两个条件的玩家列表。

4

3 回答 3

0

您在查询中缺少该statistic表。您需要根据您的where条款加入它。

您还需要使用正确的连接语法。

以下版本加入统计表两次,一次用于“1”,一次用于“3”:

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

您将希望加入统计表两次:

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 回答
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 回答