【问题标题】:MySQL randomized list with sequence in listMySQL随机列表与列表中的序列
【发布时间】:2020-07-14 18:13:54
【问题描述】:

我有一张学生表(id、name、project)。我想要一个随机排列的学生,他们的项目是“%science%”。

SELECT NAME, id FROM students WHERE project LIKE '%science%' ORDER BY RAND()

复杂之处在于:我想在随机列表中获取每个学生的“序列号”。这就是我所拥有的,但它不起作用。

SET @sequence=0;
SELECT @sequence:=@sequence+1 AS sequence, name, id
  FROM students
  WHERE project LIKE '%science%'
  ORDER BY RAND();
SELECT @sequence;

有人可以帮忙解决这个问题吗?

运行1:

1   486 Linda
2   307 Patricia
3   218 Barbara
4   713 Mary

运行2:

1   713 Mary
2   486 Linda
3   307 Patricia
4   218 Barbara

感谢, 乔安娜

【问题讨论】:

    标签: mysql sql random sql-order-by


    【解决方案1】:

    MySQL 用户变量和order by 很棘手。 documentation says

    HAVING、GROUP BY 和 ORDER BY 在引用在选择表达式列表中分配了值的变量时无法按预期工作,因为该表达式是在客户端上计算的,因此可以使用前一个中的陈旧列值行。

    在子查询中order by比较安全,然后赋值变量:

    SET @sequence=0;
    SELECT @sequence:=@sequence+1 sequence, s.*
    FROM (
        SELECT name, id 
        FROM students 
        WHERE project LIKE '%science%' 
        ORDER BY RAND()
    ) s;
    

    Demo on DB Fiddle

    运行 1:

    序列 |姓名 | ID --------: | :------- | --: 1 |琳达 | 486 2 |帕特里夏 | 307 3 |玛丽 | 713 4 |芭芭拉 | 218

    运行 2:

    序列 |姓名 | ID --------: | :------- | --: 1 |芭芭拉 | 218 2 |帕特里夏 | 307 3 |玛丽 | 713 4 |琳达 | 486

    请注意,如果您运行的是 MySQL 8.0,则使用窗口函数可以更简单(且高效)地完成:

        SELECT name, id, row_number() over(order by rand()) sequence
        FROM students 
        WHERE project LIKE '%science%' 
        ORDER BY sequence
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      • 2017-03-26
      相关资源
      最近更新 更多