【问题标题】:MySQL ORDER BY rand(), name ASCMySQL ORDER BY rand(),名称为 ASC
【发布时间】:2011-02-22 09:11:48
【问题描述】:

我想获取一个包含 1000 个用户的数据库并选择 20 个随机用户 (ORDER BY rand(),LIMIT 20),然后按名称对结果集进行排序。我想出了以下查询,它没有像我希望的那样工作。

SELECT * FROM users WHERE 1 ORDER BY rand(), name ASC LIMIT 20

【问题讨论】:

  • 究竟是什么不适合你?
  • 当我在这里的 1600 个用户的数据库上尝试按 rand() 限制 3 排序时,我始终得到随机结果。
  • @vfilby:是的,现在试试order by rand(), name asc,你会发现它不是按名称排序的。

标签: php mysql database select random


【解决方案1】:

使用子查询:

SELECT * FROM 
(
    SELECT * FROM users ORDER BY rand() LIMIT 20
) T1
ORDER BY name 

内部查询随机选择 20 个用户,外部查询按名称对选定的用户进行排序。

【讨论】:

  • 太棒了,有两件事。为什么在查询后T1,它的目的是什么?第二:你知道datamapper中是否可以使用子查询吗?
  • 啊,所以您将内部选择转换为新的临时表。明白了。
  • @Josh K:关于你的第一个问题,它被称为别名。如果你省略它,你会得到这个错误:Every derived table must have its own alias.
【解决方案2】:

由于性能和结果,请注意 ORDER BY RAND()。查看这篇文章:http://jan.kneschke.de/projects/mysql/order-by-rand/

【讨论】:

  • 同意,这可能是性能最差的查询。
  • 额外的 WHERE 约束将 RAND 负载放置在最多 500 行上。这不是一个巨大的表,性能不是问题。
【解决方案3】:

您可以使用两个单独的查询,而不是使用子查询,一个用于获取行数,另一个用于选择随机行。

SELECT COUNT(id) FROM users; #id is the primary key

然后,随机获取二十行。

$start_row = mt_rand(0, $total_rows - 20);

最终查询:

SELECT * FROM users ORDER BY name ASC LIMIT $start_row, 20;

【讨论】:

  • 我相信这应该是正确的答案,只是因为我认为资源可能低于调用 RAND() 或使用“子查询”。
  • 你总是会得到 20 个连续的用户(他们的名字是“连续的”),而不是随机的 20 个。
【解决方案4】:
SELECT  *
FROM    (
        SELECT  *
        FROM    users
        WHERE   1
        ORDER BY
                rand()
        LIMIT 20
        ) q
ORDER BY
        name

【讨论】:

    【解决方案5】:

    使用子查询:

    SELECT * FROM (
        SELECT * FROM users ORDER BY RAND() LIMIT 20
    ) u
    ORDER BY name
    

    或加入自身:

    SELECT * FROM users u1
    INNER JOIN (
        SELECT id FROM users ORDER BY RAND() LIMIT 20
    ) u2 USING(id)
    ORDER BY u1.name
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-28
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多