2014-11-03 3 views
0

Я должен добавить модуль уведомления о существующем проекте. Моя структура таблицы похожа на рис.Sql conditional Присоединиться к различным таблицам

Изображение: conditionalJoin

, как вы видите на картинке каждое уведомление имеет тип и releatedID.

Тип 1 = резервирование будет отменено, идентификатор Сопутствующего идентификатор на «оговорках» таблицы

Тип 3 Баланса = счет по данной мин. limit so releaseedID - это идентификатор на «account_movements» Таблица

То, что я пытаюсь сделать, является условным соединением, чтобы избежать 2 разных запросов sql;

  1. Получить все уведомления, которые относятся к человеку
  2. Получить уведомление детали из разных таблиц, основанных на «notification.Type»

Так что вопрос я могу сделать это в одном запросе?

ответ

2

Что-то вроде должно работать. В основном вы указываете, какие записи в вашей таблице notifications соединяются с записями в вашей таблице reservations или вашей таблице account_movements, когда вы присоединяетесь к этим. Используйте LEFT JOIN, чтобы все ваши записи notification прошли проверку и только те записи в таблице reservations ИЛИ account_movements, которые проводят матч.

SELECT 
    n.id, 
    n.type, 
    n.companyid, 
    n.personid, 
    n.relatedid, 
    n.description, 
    r.details as reservation_details, 
    am.details as account_movement_details, 
    COALESCE(r.details, am.details) AS combined_detail 
FROM 
    notifications n 
    LEFT OUTER JOIN reservations r ON 
    n.relatedid = r.id AND 
    n.type = 1 
    LEFT OUTER JOIN account_movements am ON 
    n.relatedid = am.id AND 
    n.type = 3 

Вот SQL FIDDLE с раствором, а также.

Я добавил в COALESCE(), чтобы показать, что, поскольку JOINS являются взаимоисключающими, то можно смело комбинировать столбцы из вашего reservations таблицы и вашей account_movements таблицы в одну колонку, не опасаясь отсутствия или дублирования каких-либо данных.

1

Если вы делаете левое соединение, вы не должны иметь каких-либо условий:

SELECT * FROM notifications n 
LEFT JOIN reservations r ON n.releatedID = r.id 
LEFT JOIN account_movements m ON m.releatedID = m.id 
+2

Что произойдет, если таблицы резервирования и account_movements имеют запись, которая имеет идентификатор, равный выпущенномуID? Разве я не стану, чем записи из обеих таблиц? – Alchalade

+0

Если есть записи в резервировании и account_movements, вы получите строку со всеми датами уведомлений, всеми датами резервирования и всеми данными account_movements, каждая из которых имеет префикс их имени таблицы. В коде, который вы сделаете после вашего запроса, вы берете тип уведомления в учетной записи и сохраняете данные резервирования или account_movement соответственно. – Veve

+0

@JNevill ответ более полный и позволяет извлекать только необходимые данные. – Veve

Смежные вопросы