Почему я получаю несколько строк в запросе MYSQL?
Я пытаюсь получить случайную строку из таблицы (пользователя), используя первичный ключ _id и следующий запрос.
SELECT *
FROM user
WHERE _id IN (SELECT Floor(1 + ( Rand() * ( Count(_id) - 1 ) ))
FROM user);
Строки не были удалены из таблицы, но я (несогласованно) вернул несколько строк...
Я нахожу это удивительным, так как любой результат из подзапроса должен обязательно вернуть одно целое число, которое против первичного ключа..... всегда должно быть только 1 запись!
Я хочу использовать один запрос, я, вероятно, сделаю его подготовленным оператором, и я не использую предложение LIMIT, потому что я не могу использовать @variables для выбора случайной строки.
Мое приветствие MySQL говорит мне, что моя версия выглядит следующим образом: Версия сервера: 5.5.29-0ubuntu0.12.04.2 (Ubuntu)
3 ответа
Как насчет использования ORDER BY RAND() LIMIT 1;
в вашем запросе вместо where _id IN (select FLOOR(1+(RAND()*(COUNT(_id)-1))) from user);
Вы получаете несколько строк, потому что (выберите FLOOR(1+(RAND()*(COUNT(_id)-1))) от пользователя) вернет вам другое значение для каждой записи в таблице 'user'. Это из-за бит RAND.
Бежать select FLOOR(1+(RAND()*(COUNT(_id)-1))) from user
сам по себе, и вы увидите.
Случайная часть оценивается один раз за строку, поэтому иногда вы получаете много строк, а иногда нет. Чтобы сделать это легко и быстро, используйте равное соединение и ограничение
SELECT
*
FROM
user
WHERE
_id > (
SELECT
FLOOR(1+(RAND()*(max(_id)-min(_id))))
FROM
user
) LIMIT 1
;
select *
from user join (select FLOOR(1+(RAND()*(COUNT(_id)-1))) as _id from user) as Temp
on user._id=Temp._id
Скрипка - http://sqlfiddle.com/