Почему я получаю несколько строк в запросе 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/

Другие вопросы по тегам