【问题标题】:Query different IDs with different values?用不同的值查询不同的ID?
【发布时间】:2012-11-26 02:45:10
【问题描述】:

我正在尝试为高尔夫数据库编写查询。它需要返回拥有statisticID = 1p2sStatistic > 65 以及同时拥有statisticID = 3p2sStatistic > 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 的图片

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

【问题讨论】:

  • 在什么情况下不起作用?语法错误?结果错误?
  • 请贴出这3张表的表结构。
  • 请向我们展示您的表格 - 附带一些示例数据和预期输出。
  • Bad habits to kick : using old-style JOINs - ANSI-92 SQL 标准 ( 20 年前!)。 停止使用
  • 首先披露您使用的数据库系统及其版本号。

标签: sql relational-division sql-match-all


【解决方案1】:

对于玩家列表没有重复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 relation

【讨论】:

    【解决方案2】:

    您的查询中缺少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)
    

    【讨论】:

      【解决方案3】:

      您需要加入统计表两次:

      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;
      

      【讨论】:

        猜你喜欢
        • 2022-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-19
        • 2017-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多