#mysql #sql
#mysql #sql
Вопрос:
итак, у меня есть три таблицы с содержимым и одна, которая содержит порядок строк этих трех таблиц
вот таблицы
table content_order
id | content_type | content id
1 | content1 | 1
2 | content1 | 2
3 | content3 | 1
4 | content2 | 1
table content1
id | some_text
1 | aaaa
2 | bbb
table content2
id | some_text
1 | text yyyy
table content3
id | some_text
1 | text bbbb
итак, как мне это получить?
content_type | some_text | content_id
content1 | aaaa | 1 |
content2 | bbb | 2 |
content3 | yyyy | 1 |
content2 | bbbb | 1 |
Комментарии:
1. похоже, в ваших результатах опечатка. разве 2-я строка не должна быть content1?
Ответ №1:
Это будет работать на t-sql, для mysql могут быть небольшие различия.
select co.content_type,
coalesce(c1.some_text,c2.some_text,c3.some_text) as some_text,
coalesce(c1.id,c2.id,c3.id) as content_id
from content_order co
left join content1 c1 on co.content_id = c1.id and co.content_type = 'content1'
left join content2 c2 on co.content_id = c2.id and co.content_type = 'content2'
left join content3 c3 on co.content_id = c3.id and co.content_type = 'content3'
order by co.id
Комментарии:
1. это хороший вариант, но приведенный ниже ответ подходит лучше, поскольку у меня нет одинаковых строк во всех трех таблицах
2. @luka — Если бы вы понимали sql, вы бы знали, что количество строк в 3 таблицах содержимого не имеет значения, и мое решение значительно быстрее.
Ответ №2:
Попробуйте это:
SELECT content_type, some_text, id as content_id
FROM (
SELECT 'content1' as content_type, content1.Id, content1.some_text
UNION ALL SELECT 'content2', content2.Id, content2.some_text
UNION ALL SELECT 'content3', content3.Id, content3.some_text) contents
JOIN content_order
ON content_order.content_type = contents.content_type
AND content_order.content_Id = contents.Id
ORDER BY content_order.id
Комментарии:
1. Он хочет, чтобы это было в порядке content_order.id