0
 SELECT name
  FROM random AS r1 JOIN
       (SELECT (RAND() *
                     (SELECT MAX(id)
                         FROM random)) AS id)
        AS r2
 WHERE r1.id >= r2.id
 ORDER BY r1.id ASC
 LIMIT 1;

MySQL の最適化を調べているときに、このクエリを思いつきました。しかし、データベースからランダムなユーザーを取得したいので、それは私の目的を完全には果たしませんが、アクティブなフィールドもあります。したがって、「アクティブ= 1」であることを確認したいのですが、それをこのクエリにプラグインして機能させる場所がわかりません。

4

2 に答える 2

3

私はこれがそれを行うべきだと思います:

SELECT name
FROM random r1
JOIN (SELECT RAND()*MAX(id) randid
      FROM random
      WHERE active = 1) r2
WHERE r1.id >= r2.randid
AND r1.active = 1
ORDER BY r1.id
LIMIT 1

active = 1サブクエリとメイン クエリの両方でテストする必要があります。

于 2013-07-30T03:18:43.097 に答える
1
SELECT * FROM users WHERE active = 1 ORDER BY RAND() LIMIT 1;

にはさらに最適化された代替手段RAND()がありますが、上記から始めてクエリを単純化し、後で最適化することをお勧めします。

于 2013-07-30T03:13:57.800 に答える