Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在子查询WHERE子句中重用变量?_Mysql - Fatal编程技术网

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感谢您回答最初的问题。我不知道你需要我来修理什么。这个例子太小了吗?