Mysql select选择每个值的3倍

Mysql select选择每个值的3倍,mysql,Mysql,我运行以下查询: SELECT routes.route_number, routes.frequency FROM routes, (SELECT proportion FROM operation_proportions WHERE operator='Venture Travel') AS Prop WHERE routes.route_number IN (SELECT route FROM operation_proportions WHERE operator='Ve

我运行以下查询:

SELECT routes.route_number, routes.frequency 
FROM routes, 
  (SELECT proportion FROM operation_proportions WHERE operator='Venture Travel') AS Prop 
WHERE routes.route_number 
  IN (SELECT route FROM operation_proportions WHERE operator='Venture Travel');
我得到的结果是:

正如您所看到的,每个值都被选择了3次,原因我无法理解。出于测试目的,我删掉了sql语句的一些部分,因为我得到的结果不是预期的结果

以下是我想开始工作的完整声明:

SELECT SUM((Prop.proportion / 100) * routes.frequency) AS TotalJourneys 
FROM routes, 
  (SELECT proportion FROM operation_proportions WHERE operator='Venture Travel') AS Prop 
WHERE routes.route_number 
  IN (SELECT route FROM operation_proportions WHERE operator='Venture Travel');
基本上,我试图实现的是计算运营商Venture Travel每小时的公交线路总数。比例是一个介于0-100之间的值(在这种情况下,仅使用100和50,因此这不是问题),频率是指每小时由公交车完成路线的次数

因此,我的最终目标是用几句话来概括:总结Venture Travel运营的路线的每个频率*(比例/100)

很抱歉,我没有正确解释某些内容或遗漏了有用的数据,如果您需要更多信息来帮助我,请告诉我。谢谢。

聚合上下文中通常使用
SUM()
函数。因此,我建议您打算为表中的每个路由编号计算一些统计信息。我猜你在这里想要什么:

SELECT r.route_number,
       SUM((o.proportion / 100) * r.frequency) AS TotalJourneys 
FROM routes r
INNER JOIN operation_proportions o
    ON r.route_number = o.route
GROUP BY r.route_number
WHERE o.operator = 'Venture Travel'

内联视图
Prop
的原因是什么?根据对观察到的行为的描述,我们怀疑内联视图查询

         SELECT proportion
           FROM operation_proportions
          WHERE operator = 'Venture Travel'
正在返回三排。这三行中的每一行都与
routes
返回的每一行“匹配”。查询的结果是笛卡尔积。。。
返回的每一行路由
与内联视图返回的每一行匹配

问题中的第一个查询可以等价地写为

 SELECT r.route_number
      , r.frequency
   FROM routes r
  CROSS
   JOIN ( SELECT p.proportion 
            FROM operation_proportions p
           WHERE p.operator = 'Venture Travel'
        ) q
  WHERE r.route_number IN ( SELECT o.route 
                              FROM operation_proportions o
                             WHERE o.operator = 'Venture Travel'
                          )
我们可以消除内联视图的连接,这样我们只能从
routes
获取每行的一个副本

SELECT r.route_number
     , r.frequency
  FROM routes r
 WHERE r.route_number IN ( SELECT o.route 
                             FROM operation_proportions o
                            WHERE o.operator = 'Venture Travel'
                         )

如果
操作员='Venture Travel'
行的
route
列的值在
操作中是唯一的,我们可以使用联接操作返回等效结果

SELECT r.route_number
     , r.frequency
  FROM routes r
  JOIN operation_proportions o
    ON o.route = r.route_number
 WHERE o.operator = 'Venture Travel'
这将让我们从匹配行返回
比例
列的值,并将其包含在表达式中

 SELECT r.route_number
      , r.frequency
      , o.proportion
      , r.frequency * o.proportion / 100.0
   FROM routes r
   JOIN operation_proportions o
     ON o.route = r.route_number
  WHERE o.operator = 'Venture Travel'
然后我们可以使用一个聚合函数来“折叠”行以得到一个总数

 SELECT SUM( r.frequency * o.proportion / 100.0 ) AS TotalJourneys
   FROM routes r
   JOIN operation_proportions o
     ON o.route = r.route_number
  WHERE o.operator = 'Venture Travel'


如果
路线
操作
不同,我们可以解决这个问题。我们只需要确定是要返回所有匹配的行,还是要返回这些行中的哪一行。

此查询是否返回3行<代码>从操作员='Venture Travel'所在的操作比例中选择比例子查询的使用很可能是问题所在。我认为在这种情况下没有必要。试着用一个简单的连接来代替吗?我的答案也被否决了。在我看来,这个答案中的查询是合理的,没有模式定义、示例数据和所需的结果集,我们只是猜测。但这似乎是一个合理的猜测+谢谢你,正是我想要的。我也能理解我做错了什么,这是一个很好的解释。@ZedZerg:我的回答有时会很冗长。我真诚地向“尝试这个”答案的爱好者道歉。好像你对为什么查询会这样感兴趣,我试着回答这个问题。我接着解释了我们应该如何编写一个查询来实现您想要实现的目标。我希望这个答案不仅仅是修复这一个查询,还提供了一个可以保存在SQL工具带中的模式。