Смешивание RAND () и UNION дает случайное количество строк? - PullRequest
1 голос
/ 16 сентября 2010

Я тестировал запрос, чтобы получить случайное целое число в MySQL, и я заметил следующее:

mysql> SELECT FLOOR(0 + (RAND() * 5)) UNION SELECT FLOOR(0 + (RAND() * 5)) UNION SELECT FLOOR(0 + (RAND() * 5));
+-------------------------+
| FLOOR(0 + (RAND() * 5)) |
+-------------------------+
|                       1 |
|                       2 |
|                       4 |
+-------------------------+
3 rows in set (0.00 sec)

mysql> SELECT FLOOR(0 + (RAND() * 5)) UNION SELECT FLOOR(0 + (RAND() * 5)) UNION SELECT FLOOR(0 + (RAND() * 5));
+-------------------------+
| FLOOR(0 + (RAND() * 5)) |
+-------------------------+
|                       4 |
+-------------------------+
1 row in set (0.00 sec)

mysql> SELECT FLOOR(0 + (RAND() * 5)) UNION SELECT FLOOR(0 + (RAND() * 5)) UNION SELECT FLOOR(0 + (RAND() * 5));
+-------------------------+
| FLOOR(0 + (RAND() * 5)) |
+-------------------------+
|                       1 |
|                       4 |
|                       0 |
+-------------------------+
3 rows in set (0.00 sec)

Кажется, я получаю случайное количество строк в наборе результатов!Там 3 UNION ed SELECT s.Что здесь происходит?Я думал, что, возможно, один из результатов оператора rand не был кортежем из-за RAND(), но это не имеет смысла - должен быть какой-то результат, по крайней мере NULL!

mysql> select version();
+-------------------+
| version()         |
+-------------------+
| 5.0.51a-24+lenny4 |
+-------------------+
1 row in set (0.00 sec)

1 Ответ

3 голосов
/ 16 сентября 2010

UNION исключает повторяющиеся результаты, потому что это оператор установки.Если вы хотите сохранить дубликаты, используйте UNION ALL.Может быть, я неправильно понял ваш вопрос, но похоже, что это именно тот результат, который я ожидал получить по этому запросу.

...