MySql: получить две случайные строки с разными значениями - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть эта таблица:

enter image description here

Я хочу получить 2 случайных строки при условии публикации и иметь разные значения местоположения (например, еслипервый ряд вертикальный, второй должен быть горизонтальный).

Я пробовал это

  SELECT * FROM publicity where published = 1 and location = 'vertical' 
   UNION 
  SELECT * FROM publicity where published = 1 and location = 'horizontal'
   ORDER BY rand() LIMIT 2

Иногда это дает мне 2 строки с одинаковым значением местоположения.

1 Ответ

0 голосов
/ 25 сентября 2018

Ваше требование требует случайных предметов из двух разных наборов предметов.Один вы назвали 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 работает правильно, но, как известно, медленно, особенно на больших таблицах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...