как выбрать строку из одной из трех таблиц на основе четвертой таблицы, которая содержит порядок этих записей из всех трех таблиц

#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