Страницы

Поиск по вопросам

суббота, 7 марта 2020 г.

Несколько результатов из БД, с учётом сортировки

#mysql #sql #база_данных #select #выборка


Имеется таблица book в которой около 50 записей.
Поля таблицы id(int),name(varchar),path(text),lang(int, value = 1,2,3).
lang=1 примерно 18 записей
lang=2 примерно 16 записей
lang=3 примерно 16 записей
Необходимо составить sql запрос, чтобы выбрать 3 книги, первая из которых это случайное
число из первых 18 записей, второе это тоже случайное число из вторых 16 записей, и
третья соответственно тоже случайное число из последних 16 записей

Что то на подобие такого: 
SELECT * FROM book 
            WHERE lang=1 ORDER BY RAND () LIMIT 1 
                                               AND 
            WHERE lang=2 ORDER BY RAND () LIMIT 1
                                               AND 
            WHERE lang=3 ORDER BY RAND () LIMIT 1;
    


Ответы

Ответ 1



Для ваших объемов данных подойдет очень простой запрос: SELECT random_book.* FROM book LEFT JOIN (SELECT * FROM book ORDER BY RAND()) random_book ON (book.lang = random_book.lang) GROUP BY random_book.lang ORDER BY RAND() - это не быстро на больших обьемах данных.

Ответ 2



Для ваших объемов: SELECT * FROM book WHERE lang=1 ORDER BY RAND() LIMIT 1 UNION SELECT * FROM book WHERE lang=2 ORDER BY RAND() LIMIT 1 UNION SELECT * FROM book WHERE lang=3 ORDER BY RAND() LIMIT 1 Для больших объемов используйте min(id), max(id), rand() и математику в where - будет без order by rand

Комментариев нет:

Отправить комментарий