Ваше требование требует случайных предметов из двух разных наборов предметов.Один вы назвали horizontal
, а другой vertical
.Таким образом, вы должны получить эти два случайных элемента, а затем взять их объединение.
SELECT * FROM (SELECT whatever FROM table WHERE location='horiz' ORDER BY RAND() LIMIT 1) h
UNION ALL
SELECT * FROM (SELECT whatever FROM table WHERE location='vert' ORDER BY RAND() LIMIT 1) v
Если вы примените операцию ORDER BY RAND() LIMIT 1
ко всему набору результатов, вы можете получить оба элемента из одного места.
Два запроса заключены в SELECT * FROM (SELECT ... ) a
, потому что MySQL хочет применить предложения ORDER
и LIMIT
после того, как он принял объединение ..
Почему UNION ALL
?Потому что UNION
дедуплицирует его набор результатов, и вам не нужно это делать.
Pro tip : ORDER BY RAND() LIMIT 1
работает правильно, но, как известно, медленно, особенно на больших таблицах.