Например, у меня есть таблицы ниже:
Таблица 1:
-------------------------
| UID | Date |
-------------------------
| John | 2 |
| mark | 4 |
-------------------------
Таблица 2:
-------------------------
| UID | Date |
-------------------------
| smith | 1 |
| Nork | 3 |
-------------------------
Результат Я ожидаю, что это будет порядок по дате:
----------
| smith |
| John |
| Nork |
| mark |
----------
Я старался:
(SELECT UID
FROM table1
ORDER BY DATE DESC
LIMIT 16)
UNION
(SELECT UID
FROM table2
ORDER BY DATE DESC
LIMIT 16)
Но результат It print заключается в том, что он получает таблицу1 сначала и все ее строки, а затем переходит к таблице2.
В вашем запросе вы отдельно сортируете каждый набор результатов из таблиц, чтобы применить ограничение на извлеченные строки.
Если вы хотите сохранить порядок объединенных результирующих наборов, вам необходимо применить его еще раз. Для этого используйте подзапрос. Вам нужно будет переместить столбец date
дальше, чтобы иметь возможность сделать это, поэтому я изменил UNION
на UNION ALL
потому что нам не нужно применять его на этом уровне. На более высоком уровне добавление DISTINCT
позаботится об уникальных значениях.
SELECT DISTINCT UID
FROM (
(SELECT UID, DATE FROM table1 ORDER BY DATE DESC LIMIT 16)
UNION ALL
(SELECT UID, DATE FROM table2 ORDER BY DATE DESC LIMIT 16)
) t
ORDER BY DATE
Incorrect usage of UNION and ORDER BY
и я полагаю, что t
перед ORDER BY является ошибкой?
t
необходима, поскольку она назначает псевдоним (имя) нашей таблицы, выходящий из подзапроса.
Я пытаюсь использовать mysql db, как эти данные. это хорошо работает. Попробуйте следующее:
SELECT t.UID FROM
(SELECT t1.UID,t.DATE FROM table1 t1
UNION ALL
SELECT t2.UID,t.DATE FROM table2 t2
) as t
ORDER BY t.DATE ASC
ORDER BY
с из вашего запроса, завернуть его в другойSELECT
, и положить одинORDER BY
на том , что вместо этого. Что-то вродеSELECT x.uid FROM (SELECT uid, date FROM t1 UNION SELECT uid, date FROM t2) x ORDER BY x.date
union all
). Опубликуйте это как ответ.