MySQL Создание расширенного запроса - PullRequest
0 голосов
/ 09 января 2012

Резюме

Итак, у меня есть 3 таблицы, скриншоты которых приведены ниже. Каждый пользователь получит 10 слайдов по умолчанию при регистрации, так что информация находится в таблице «слайды». Template_id - это просто еще одна моя таблица, которая идентична таблице custom_slides, за исключением того, что есть 10 готовых слайдов, которые являются слайдами по умолчанию, поэтому, если я когда-нибудь захочу обновить имя страницы слайда по умолчанию, я просто сделаю это один раз в этой таблице шаблонов.

Если слайд представляет собой пользовательский слайд, то template_id будет иметь значение NULL, как вы видите для слайда 11, а слайд 11 помещается в таблицу custom_slides.


Что мне нужно

Так что мне нужна помощь в написании запроса, чтобы получить некоторую информацию. Я хочу получить слайд, идентификатор сортировки и имя страницы для определенного пользователя.

Пока у меня есть следующее:

SELECT slide_id, sort_order FROM `user_slides` WHERE user_id = 1

Теперь мне нужно получить имя_страницы, но мне нужно выполнить отдельный запрос.

  • Проверьте значение slide_id в таблице слайдов и посмотрите, имеет ли значение template_id значение NULL или значение.
  • если оно имеет значение, то это слайд по умолчанию, поэтому, если template_id равен 3, мне нужно выполнить запрос, чтобы получить имя_страницы из таблицы шаблонов, где template_id = 3
  • если template_id равен NULL, мне нужно выполнить запрос для поиска имени страницы в таблице custom_slides, где slide_id = любой идентификатор слайда.

У меня пока нет опыта работы с несколькими запросами и UNION и всем прочим, поэтому, если кто-то может помочь мне начать создавать этот запрос, я был бы очень признателен.


Таблица предварительного просмотра

user_slides

enter image description here

Слайды

enter image description here

custom_slides

enter image description here

Ответы [ 2 ]

2 голосов
/ 09 января 2012

Я считаю, что этот запрос должен получить данные, которые вы хотите:

SELECT slide_id, sort_order, COALESCE(`templates`.page_name, `custom_slides`.page_name)  
FROM `user_slides` 
JOIN `slides` ON `slides`.slide_id = `user_slides` .slide_id
LEFT OUTER JOIN `templates` ON `templates`.template_id = `slides`.template_id
LEFT OUTER JOIN `custom_slides` ON `slides`.template_id IS NULL AND `custom_slides`.slide_id = `slides`.slide_id
WHERE `user_slides`.user_id = 1

Пояснение: Это в основном выбранный вами запрос с несколькими объединениями. Сначала таблица slides соединяется в соответствии с slide_id. Затем таблица templates объединяется, внешнее объединение гарантирует, что строки, где template_id равен NULL, все еще включены. И наконец, таблица custom_slides объединяется, но только если template_id равен NULL. затем, используя COALESCE, мы выбираем имя страницы из custom_slides или templates.

1 голос
/ 09 января 2012

вы можете попробовать с двумя левыми соединениями в таблице шаблонов (вы не дали имя, поэтому я просто назвал его "шаблонами" в моем примере) и в таблице custom_slides.

SELECT * 
FROM user_slides us
INNER JOIN slides s 
  ON us.slide_id = s.slide_id
LEFT JOIN templates t
  ON s.template_id=t.template_id
LEFT JOIN custom_slides cs
  ON s.slide_id = cs.slide_id
WHERE user_id = 1

это должно вернуть все строки в user_slides и slides, даже если в templates нет соответствующих строк (т.е. в вашем случае, когда template_id в slides равно NULL) или в custom_slides (т.е. если slide_id не является пользовательским слайдом и не существует в таблице custom_slides).

Однако у вас все еще должна быть некоторая логика на прикладном уровне (при условии, что приложение выполняет запрос и использует результаты), чтобы проверить, равен ли template_id значение NULL или нет, и использовать custom_slides, если это так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...