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工具带中的模式。