Как работает данный sql запрос

Здравствуйте!

Прощу помощи: каков принцип данного sql запроса:
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
  • Вопрос задан
  • 2822 просмотра
Решения вопроса 1
metamorph
@metamorph
Достаточно несложно, однако есть нюансы.

SELECT MAX(id) FROM random тупо добывает максимальный id в таблице (обозначу его как $max).
RAND() * $max дает нам некий произвольный ID из таблицы.

Сложная скобочная конструкция, с которой джойнится таблица random создает временную таблицу, в которой, грубо говоря, лежит заданное кол-во произвольно выбранных (при помощи rand() * $max) ID.

Условие вида r1.id >= r2.id позволяет учесть потенциальные пропуски в ID (какие-то из записей были удалены, к примеру).

Теперь нюансы:
1. Я не уверен, что все БД схавают джойн по нецелому ID. Возможно, имело бы смысл сначала округлить.
2. На первый взгляд, нет контроля за дубликатами.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы