Mysql 如何在子查询WHERE子句中重用变量?
我有一个每个用户的平均结果表。 我想找出平均结果更好的用户百分比Mysql 如何在子查询WHERE子句中重用变量?,mysql,Mysql,我有一个每个用户的平均结果表。 我想找出平均结果更好的用户百分比 average_results +---------+----------------+ | user_id | average_result | +---------+----------------+ | 1 | 1.0000 | | 3 | 0.3333 | +---------+----------------+ 如果您是20个用户中的第五个用户,那么20%的用户
average_results
+---------+----------------+
| user_id | average_result |
+---------+----------------+
| 1 | 1.0000 |
| 3 | 0.3333 |
+---------+----------------+
如果您是20个用户中的第五个用户,那么20%的用户的平均结果更好
average_results
+---------+----------------+
| user_id | average_result |
+---------+----------------+
| 1 | 1.0000 |
| 3 | 0.3333 |
+---------+----------------+
这就是我正在使用的查询。
当我用0.3333硬编码@user_结果时,它可以工作,但当我没有硬编码时,它就不能工作,正如你在position和position2中看到的那样
选择@user\u结果、位置、位置2、总计、位置/总计
从…起
选择@user\u result:=平均结果
根据平均结果
其中user_id=3
作为T0,
选择COUNTaverage_结果作为位置
根据平均结果
其中平均结果>@user\u结果
作为T1,
选择COUNTaverage_结果作为位置2
根据平均结果
其中平均结果>0.3333
作为T12,
选择COUNTaverage_结果作为总计
根据平均结果
AS T2
我建议如下,这并不能回答你关于变量的实际问题,但我认为这是你想要的
SELECT t.*, position/total
FROM
(
SELECT
ar2.average_result as user_result,
SUM(CASE WHEN ar1.average_result > ar2.average_result THEN 1 ELSE 0 END) as position,
COUNT(*) as total
FROM average_results ar1 INNER JOIN average_results ar2
ON ar2.user_id = 3
) t
这是一个。我建议如下,它不能回答您关于变量的实际问题,但我认为它符合您的要求
SELECT t.*, position/total
FROM
(
SELECT
ar2.average_result as user_result,
SUM(CASE WHEN ar1.average_result > ar2.average_result THEN 1 ELSE 0 END) as position,
COUNT(*) as total
FROM average_results ar1 INNER JOIN average_results ar2
ON ar2.user_id = 3
) t
这是一个。试试这个:
SELECT *, position / total as 'position / result'
FROM (
SELECT
MAX( IF(user_id = 3 , average_result, null ) ) as result
, COUNT(IF( average_result >
(SELECT MAX( IF(user_id = 3 , average_result, null ) )
FROM average_results ), 1,NULL)) as position
, COUNT( IF( average_result > 0.3333 , 1 , NULL) ) as position2
, COUNT(average_result) as total
FROM average_results
) as tmp;
示例尝试以下方法:
SELECT *, position / total as 'position / result'
FROM (
SELECT
MAX( IF(user_id = 3 , average_result, null ) ) as result
, COUNT(IF( average_result >
(SELECT MAX( IF(user_id = 3 , average_result, null ) )
FROM average_results ), 1,NULL)) as position
, COUNT( IF( average_result > 0.3333 , 1 , NULL) ) as position2
, COUNT(average_result) as total
FROM average_results
) as tmp;
样本变量中需要它的原因是什么?这是更大查询的一部分吗?您不能在一个MySQL select语句中分配和读取同一个变量,也不能获取任何特定行为。阅读手册重新变量和重新分配。PS在代码问题中请给出一个答案。PS阅读有关浮点运算的知识。0.3333[sic]在计算机系统中通常不能精确表示,my可能会用不同的值表示,因此在程序文本中进行精确比较时必须小心。@philipxy感谢您回答最初的问题。我不知道你需要我来修理什么。这个例子太小了吗?在变量中需要它的原因是什么?这是更大查询的一部分吗?您不能在一个MySQL select语句中分配和读取同一个变量,也不能获取任何特定行为。阅读手册重新变量和重新分配。PS在代码问题中请给出一个答案。PS阅读有关浮点运算的知识。0.3333[sic]在计算机系统中通常不能精确表示,my可能会用不同的值表示,因此在程序文本中进行精确比较时必须小心。@philipxy感谢您回答最初的问题。我不知道你需要我来修理什么。这个例子太小了吗?