我有两个表topic
和question_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
答案 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;