【问题标题】:retrieve random id_post sql检索随机 id_post sql
【发布时间】:2020-09-03 17:54:06
【问题描述】:

我有这张桌子:

+---------+------+
| id_post | post |
+---------+------+
| 24      | A    |
| 26      | B    |
| 39      | C    |
| 57      | D    |
+---------+------+

我想检索一个随机的id_post

SELECT id_post
FROM  posts
WHERE rand()

我想检索单个值 24263957

我怎样才能做到这一点?

【问题讨论】:

  • 你的桌子有多大?
  • 请用您正在运行的数据库标记您的问题:mysql、postgres、sql-server...?
  • 它用于 mysql/pdo 中的大表,谢谢。

标签: mysql random sql-order-by sql-limit


【解决方案1】:

如果您只有四行,那么如何操作并不重要。但是,如果您有一个大表,您希望限制要排序的数据量。

一种方法是:

select p.id_post
from posts p cross join
     (select count(*) as cnt from posts) pp
where rand() < 100.0 / pp.cnt
order by rand()
limit 1;

虽然这需要扫描表格,但不需要对整个表格进行排序。

【讨论】:

  • 谢谢。这是一张大桌子。您的答案与下面发布的答案有什么区别?你的看起来有点复杂。我很想知道哪个选项适合一张大桌子,谢谢。或者如果两者都合适。谢谢。
  • @max 。 . .这会扫描表一次,然后排序 100 行的成本非常小。对整个表进行排序的成本要大得多。
【解决方案2】:

你似乎想要ORDER BY RAND()LIMIT 1

SELECT id_post
FROM  posts
ORDER BY rand()
LIMIT 1

您没有说明您使用的是哪个数据库。 RAND()LIMIT 1 的实际语法在不同数据库中有所不同。以上将在MySQL中工作。其他数据库中也有等价的语法,例如:

Postgres:

SELECT id_post
FROM  posts
ORDER BY random()
LIMIT 1

SQL 服务器:

SELECT TOP (1) id_post
FROM  posts
ORDER BY newid()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2021-07-02
    相关资源
    最近更新 更多