【问题标题】:How to reference derived values in other areas of MySQL select statement?如何在 MySQL select 语句的其他区域引用派生值?
【发布时间】:2012-08-29 20:55:37
【问题描述】:

我正在尝试计算一个特殊分数。 'total' 和 'correct'(或order)需要不同的查询才能获得,并且总需要在两个地方使用。这导致了使用别名的问题。在这种情况下,重复子查询的性能和可读性太高。我尝试了两种不同的方法来让它工作:

SELECT rankings.id as link, (
  SELECT COUNT(*) as total FROM rankings
  INNER JOIN ranking_data ON ranking_id = rankings.id AND `type` = 'pre_reference'
  WHERE case_id = 15 AND rankings.id = link
) as total,
ROUND(((total - `order`) / total) * 100, 2) AS score FROM rankings
INNER JOIN ranking_data ON ranking_id = rankings.id AND opinion_id = 124 AND `type` = 'pre_reference'
WHERE case_id = 15 AND user_id != 3;

在这里,我尝试为子查询返回的“总”值创建一个别名,并将其用于计分计算。链接引用在子查询中有效,但总引用在第 6 行失败。

SELECT ROUND(((total - `order`) / total) * 100, 2) AS score FROM rankings
INNER JOIN ranking_data ON ranking_id = rankings.id AND opinion_id = 124 AND `type` = 'pre_reference'
INNER JOIN (
  SELECT COUNT(*) as total FROM rankings
  INNER JOIN ranking_data ON ranking_id = rankings.id AND `type` = 'pre_reference'
  WHERE case_id = 15
) AS total_table ON total_table.id = rankings.id
WHERE case_id = 15 AND user_id != 3;

在这里,我尝试通过左连接派生表使总和可用于列列表区域进行评分。 MySQL 在第 7 行告诉我找不到 total_table.id。如果我尝试左连接,它会抛出一般语法错误。

您能否给我一个解决方案,并说明为什么其他尝试不起作用?

【问题讨论】:

  • 请告诉我们您的表结构是什么,并附上sqlfiddle.com 上的一些示例数据以及您想要显示的内容
  • 如果需要当然可以,但我认为您可能会误解这个问题。这是一个关于语法以及如何使用别名的问题 - WHERE 子句中显示的值只是示例值
  • 不要使用连接,而是在连接中使用派生表,这将为您提供命令

标签: php mysql sql phpmyadmin mysqli


【解决方案1】:

在第二个查询中,id 未明确包含在total_table 内联视图中选择的列集中;您可能还需要按id 分组。尝试将查询更改为:

SELECT ROUND(((total - `order`) / total) * 100, 2) AS score 
FROM rankings
INNER JOIN ranking_data 
ON ranking_id = rankings.id AND opinion_id = 124 AND `type` = 'pre_reference'
INNER JOIN 
( SELECT rankings.id, COUNT(*) as total FROM rankings
  INNER JOIN ranking_data 
  ON ranking_id = rankings.id AND `type` = 'pre_reference'
  WHERE case_id = 15
  GROUP BY rankings.id
) AS total_table 
ON total_table.id = rankings.id
WHERE case_id = 15 AND user_id != 3;

【讨论】:

  • 谢谢!这确实解决了最后一个查询的错误。我在顶级 sql 查询中没有这个问题。这是子查询的怪癖吗?
  • 这是查询的固有部分 - 返回的列是明确包含在 select 语句中的列,无论它是在子查询中还是主查询的一部分.
  • 好的。关于第一个查询的任何想法?
  • 是的 - total 仅在主查询的结果集中定义,而不是在正在连接的表中定义,因此它不能用于派生 select 子句中的其他项目。您可以将主查询(无分数)转换为子查询,然后从新的子查询中获取分数。
  • 我发现第二个查询还有一些问题,这似乎最接近让它工作。在派生表子查询中,我试图获取当前结果集中与rankings.id 匹配的所有记录的计数。因此,我需要将 ID 匹配在一起并计算返回的多行。如果我在子查询中选择一个计数,它不会按 ID 正确选择,因为它只返回一个 ID 和计数。如果我返回所有结果然后在计算中进行计数,它不会返回它应该返回的多个分数。
猜你喜欢
  • 2013-09-17
  • 2011-02-25
  • 2015-04-03
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 2015-09-17
  • 2012-05-02
  • 1970-01-01
相关资源
最近更新 更多