Как определить, из какого запроса извлекаются данные в операторе MySQL с помощью UNION?
Стол
id string
------------
1 aaa
2 bbb
3 ccc
4 ddd
запрос
(SELECT string FROM table WHERE id > 1 ORDER BY id ASC LIMIT 1) /* num_row = 1 */
UNION
(SELECT string FROM table WHERE id < 1 ORDER BY id DESC LIMIT 1) /* null */
UNION
(SELECT string FROM table WHERE id > 4 ORDER BY id ASC LIMIT 1) /* null */
UNION
(SELECT string FROM table WHERE id < 4 ORDER BY id DESC LIMIT 1) /* num_row = 2 */
Запрос выше вернет 2 rows
так как там нет id=5 и id=0.
Как я могу узнать, из каких запросов эти 2 строки извлекаются?
то есть, num_row = 1
от 1st SELECT
, а также num_row = 2
от 4th SELECT
4 ответа
Используйте второй столбец, чтобы указать, откуда поступают данные
(SELECT string, '1st query' as from_where FROM table WHERE ...)
UNION
(SELECT string, '2nd query' as from_whereFROM table WHERE ...)
Вы могли бы попробовать
(SELECT 1, string FROM table WHERE id > 1 ORDER BY id ASC LIMIT 1)
UNION
(SELECT 2, string FROM table WHERE id < 1 ORDER BY id DESC LIMIT 1)
UNION
(SELECT 3, string FROM table WHERE id > 4 ORDER BY id ASC LIMIT 1)
UNION
(SELECT 4, string FROM table WHERE id < 4 ORDER BY id DESC LIMIT 1)
Вы могли бы попробовать (не элегантный, как это):
(ВЫБЕРИТЕ "1", строка ИЗ таблицы, ГДЕ id > 1 ЗАКАЗАТЬ ПО ИДЕНТИФИКАТОРУ ASC LIMIT 1) / * num_row = 1 / UNION (ВЫБЕРИТЕ "2", строка ИЗ таблицы, ГДЕ идентификатор < 1 ЗАКАЗАТЬ ПО ИДЕ DESC LIMIT 1) / null / UNION (ВЫБРАТЬ '3', строка ИЗ таблицы, ГДЕ id > 4 ЗАКАЗАТЬ ПО ИДУ ASC LIMIT 1) / null / UNION (ВЫБРАТЬ '4', строка ИЗ таблицы, ГДЕ id < 4 ЗАКАЗАТЬ ПО ИДЕ DESC LIMIT 1) / num_row = 2
Вы можете добавить дополнительный постоянный столбец с общим псевдонимом:
(SELECT string, 'query_1' as query_num FROM table WHERE id > 1 ORDER BY id ASC LIMIT 1)
UNION
(SELECT string, 'query_2' as query_num FROM table WHERE id < 1 ORDER BY id DESC LIMIT 1)
UNION
(SELECT string, 'query_3' as query_num FROM table WHERE id > 4 ORDER BY id ASC LIMIT 1)
UNION
(SELECT string, 'query_4' as query_num FROM table WHERE id < 4 ORDER BY id DESC LIMIT 1)