Php 如何在MySQL select语句的其他区域引用派生值?

Php 如何在MySQL select语句的其他区域引用派生值?,php,mysql,sql,phpmyadmin,mysqli,Php,Mysql,Sql,Phpmyadmin,Mysqli,我正在计算一个特殊的分数。“总计”和“正确”(或订单)需要不同的查询才能获得,总计需要在两个地方使用。这导致了别名的使用问题。在这种情况下,重复子查询在性能和可读性方面代价太高。我尝试了两种不同的方法让它工作: SELECT rankings.id as link, ( SELECT COUNT(*) as total FROM rankings INNER JOIN ranking_data ON ranking_id = rankings.id AND `type` = 'pre_r

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

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;
在这里,我尝试为子查询返回的“total”值创建一个别名,并将其用于计分计算。链接引用在子查询中起作用,但第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。如果我尝试左连接,它将抛出一个常规语法错误


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

在第二个查询中,
id
未明确包含在
total\u表
内联视图中选择的列集中;您可能还需要按
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;

请用一些示例数据告诉我们您的表结构是什么,如果需要,您希望显示什么,但我认为您可能误解了这个问题。这是一个关于语法和如何使用别名的问题-WHERE子句中显示的值只是示例值,而不是在联接中使用联接使用派生表。这会让您非常感谢!这确实解决了上次查询的错误。我在顶级sql查询中没有这个问题。这是子查询的一个怪癖吗?它是查询固有的一部分-返回的列是select语句中显式包含的列,而不管它是在子查询中还是在主查询中。Ok。知道第一个查询吗?是-total仅在主查询的结果集中定义,而不是在要联接的表中定义,因此不能用于派生select子句中的其他项。您可以将主查询(不带分数)转换为子查询,然后从新的子查询中导出select中的分数。我发现第二个查询还有一些问题,这似乎是最接近实现此功能的查询。在派生表子查询中,我试图获取与当前结果集中的rankings.id匹配的所有记录的计数。因此,我需要将ID匹配在一起,并对返回的多行进行计数。如果我在子查询中选择一个计数,它不会正确地选择“按ID”,因为它只返回一个ID和计数。如果我返回所有结果,然后在计算中进行计数,它不会返回它应该返回的多个分数。