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

203
23 марта 2017, 19:53

Имеется таблица 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;

Answer 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() - это не быстро на больших обьемах данных.

Answer 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

READ ALSO
Как правильно сформировать запрос к mysql?

Как правильно сформировать запрос к mysql?

Есть mysql таблица id | username | number | created_at 1 | valera | 50 | 2017-03-19

204
Почему выбирает только первую строку из результата

Почему выбирает только первую строку из результата

Выбирает из базы только первую строкуЧто может быть не так?

255
SQLite - Конвертирование из String в Sql.Date

SQLite - Конвертирование из String в Sql.Date

Необходимо сконвертировать переменную типа String, в переменную типа SqlDate

238