为什么下面的查询没有给出正确的输出

时间:2019-04-21 14:07:31

标签: mysql sql

我有两个表topicquestion_set。我想显示每个主题的前3个问题,我编写了查询,但是它没有生成等级,而是为每一行给出相同的等级。

DROP TEMPORARY TABLE IF EXISTS temp_table ;
 CREATE TEMPORARY TABLE IF NOT EXISTS temp_table AS (   
 SELECT A.ID, B.topic_name 
    FROM question_sets A 
    INNER JOIN topics B 
    ON A.topic_id = B.Id 
    WHERE  test_section_id = 3 
    AND exam_category_id = 2 
    ORDER BY appeared 
 );

SELECT ID,topic_name , 
       @rank := IF(@topic = topic_name, @rank + 1, 1) AS ranking,
       @topic := topic_name 
FROM temp_table
ORDER BY topic_name DESC

1 个答案:

答案 0 :(得分:1)

在最新版本的MySQL中,您需要在使用变量之前对子查询中的数据进行排序。而且,您不应在一个表达式中分配变量,而在另一个表达式中使用它。

所以:

SELECT ID,topic_name , 
       (@rank := IF(@topic = topic_name, @rank + 1,
                    IF(@topic := topic_name, 1, 1)
                   )
       ) as ranking
FROM (SELECT tt.*
      FROM temp_table tt
      ORDER BY topic_name DESC
     ) tt CROSS JOIN
     (SELECT @topic := '', @rank := 0) params;

如果您实际上想按某个列进行排名,则可能需要在topic_name DESC之后的第二个键。您不能依赖临时表中的顺序-因为表表示无序集。

在MySQL 8+中,您只需执行以下操作:

select tt.*,
       row_number() over (partition by topic_name order by ?) as seqnum
from temp_table tt;