MYSQL выбрать 3 случайные записи, где хотя бы одно поле записи имеет определенное значение - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь выбрать 3 случайные записи из таблицы, при условии, что результат должен включать хотя бы одну запись со значением 'число', которое больше 3.

Пример таблицы:

+--------+-------+--------+
| ID     | name  | number |
+--------+-------+--------+
| 1      | name1 | 5      |
+--------+-------+--------+
| 2      | name2 | 0      |
+--------+-------+--------+
| 3      | name3 | 2      |
+--------+-------+--------+
| 4      | name4 | 7      |
+--------+-------+--------+
| 5      | name5 | 9      |
+--------+-------+--------+
| 6      | name6 | 1      |
+--------+-------+--------+
| etc... |       |        |
+--------+-------+--------+

Таким образом, результатом могут быть записи с идентификаторами: 1,2 и 6. Или 1,4 и 9. Но НЕ 2,3 и 6, потому что этот результат не включает хотя бы одну запись, где «число»> 3.

Я пытался это сделать, но он не может вернуть результаты, которые всегда включают хотя бы одну запись со значением> 3:

SELECT name, number  FROM   table
WHERE  EXISTS (
   SELECT number FROM table
   WHERE  number > 3
   ) 
ORDER BY RAND()
LIMIT 3

Я думаю, что я на неправильном пути. Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 19 марта 2019

С CTE, который создает все возможные комбинации для выбора с помощью перекрестного соединения:

WITH cte AS (
  SELECT 
    n1.id id1, n1.name name1, n1.number number1,
    n2.id id2, n2.name name2, n2.number number2,
    n3.id id3, n3.name name3, n3.number number3
  FROM numbers n1 CROSS JOIN numbers n2 CROSS JOIN numbers n3
  WHERE 
    (n1.number > 3 OR n2.number > 3 OR n3.number > 3)
    AND n1.id <> n2.id AND n1.id <> n3.id AND n3.id <> n2.id
  ORDER BY RAND() LIMIT 1
)

SELECT id1 id, name1 name, number1 number FROM cte
UNION ALL
SELECT id2 id, name2 name, number2 number FROM cte
UNION ALL
SELECT id3 id, name3 name, number3 number FROM cte

См. demo

...