Intereting Posts
SQL – LOAD DATA INFILE – выпуск UTF8 SQL: заявление о обновлении: ошибка синтаксиса Обновление с функцией, вызываемой один раз для каждой строки в Postgres 8.4 Переименуйте столбец select в sql Использование LIKE и IN и подзапроса в одном заявлении SQL Разбор SQL-запроса и выведение имени столбца и имени таблицы Атрибут сообщения UTL_MAIL, вызывающий процедуру OWA_UTIL.cellsprint Oracle Как сравнить два результата запроса для равенства в MySQL? Подключение VBA от Excel 2010 до SQL Server 2008 Обработка ошибок в Sybase SQL UPDATE Устанавливает один столбец равным значению в связанной таблице, на который ссылается другой столбец? Как вы пишете условное выражение в инструкции выбора MySQL? Oracle PL / SQL – Исключены ли NO_DATA_FOUND Исключения для производительности хранимой процедуры? Как обновить выбранные строки со значениями из файла CSV в Postgres? Как использовать определенные пользователем функции SQL в .NET?

Как выбрать случайную строку с предложением group by?

У меня есть следующая таблица

SQLFiddle

Я пытаюсь выбрать три случайных изображения, но чтобы убедиться, что два изображения не имеют одного и того же объекта, я попытался сделать GROUP BY вместе с ORDER BY rand (), но это не так, как он всегда дает мне cat1.jpg, dog1.jpg, box1.jpg (Все изображения, путь которых заканчивается 1, а не другие)

Скрипка включает запрос, который я запускал, и то, как он не работает.

    То, что вам нужно, это случайная агрегированная функция. Обычно в текущих РСУБД не существует таких функций.

    Аналогичный вопрос был задан .

    Итак, основная идея состоит в том, чтобы перетасовать элементы, затем группировать, а затем для каждой группы просто выбрать первую строку для каждой группы. Если мы изменим один из ответов, предоставленных по ссылке, мы получим это.

    select object_id, name, image_path from (SELECT images.image_path AS image_path, objects.id AS object_id, objects.name FROM objects LEFT JOIN images ON images.object_id = objects.id ORDER BY RAND()) as z group by z.object_id, z.name 

    Вы не можете получить случайное изображение, так как MySQL всегда возвращает эти данные в зависимости от времени вставки (сначала, первая подача), т. Е. Внутреннего порядка.

    Но вы можете получить случайный результат, используя следующий подход ( скрипка ):

     SELECT images.image_path AS image_path, objects.name FROM objects LEFT JOIN ( SELECT object_id, SUBSTRING_INDEX(GROUP_CONCAT(image_path order by rand()), ',', 1) AS image_path FROM images GROUP BY object_id ) as images ON images.object_id = objects.id GROUP BY objects.name 

    Если в таблице объектов есть ограничивающее условие WHERE, вы можете получить лучшую производительность при первом подключении и GROUP_CONCAT.

    Я думаю, что это должно сделать:

    ORDER BY random () LIMIT 1