Предположим, у меня есть три таблицы - list
, a
и b
table list
|a_id|--|b_id|--'name'
|4 |--|3 |--|foo|
|1 |--|2 |--|foo|
table a
|id|--|name|--|order|
|1 |--|a_1 |--|1 |
|2 |--|a_2 |--|2 |
.....................
|n |--|a_n |--|n |
table b
|id|--|name|--|order|
|1 |--|b_1 |--|1 |
|2 |--|b_2 |--|2 |
.....................
|n |--|b_n |--|n |
a_id
в таблице list
является идентификатор из a
таблице, и
b_id
в list
таблиц - это идентификатор таблицы b
Мне нужно получить список имен из таблиц a
и b
упорядоченных по их порядку, где name
= 'foo' в таблице list
.
то есть. мне нужно получить a_1
, a_4
из таблицы a
и b_2
, b_3
из b
.
Я написал запрос как
SELECT
'a_1_table'.'name' a_1_name,
'b_1_table'.'name' b_1_name
FROM
'list'
LEFT JOIN
'a_1' AS a_1_table ON ( 'a_1_table'.'id' = 'list'.'a_id' )
LEFT JOIN
'b_1' AS b_1_table ON ( 'b_1_table'.'id' = 'list'.'b_id' )
WHERE
'list'.'name' = 'foo'
но, как я вижу, в такой структуре я не могу написать order by...
то есть. Я могу, но я не получу то, что хочу.
Что я могу сделать?
Использование:
SELECT x.name
FROM (SELECT a.name, a.order, 1 AS sort
FROM LIST l
JOIN a ON a.id = list.a_id
WHERE l.name = 'foo'
UNION ALL
SELECT b.name, b.order, 2 AS sort
FROM LIST l
JOIN b ON b.id = list.b_id
WHERE l.name = 'foo') x
ORDER BY x.sort, x.order
UNION ALL
быстрее, чем UNION
, поскольку он не удаляет дубликаты (что делает UNION
).