類似下面應該工作。基本上,您可以指定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()
加入只是爲了顯示,自連接是相互排斥的,您可以安全地從reservations
表和你account_movements
表列合併成一列,而不必擔心丟失或複製任何數據。
如果reservation和account_movements表中的某個條目的ID等於相關ID,會發生什麼情況?我會不會比兩張桌子上的作品都變得更好? – Alchalade 2014-11-03 14:49:56
如果在預訂和account_movements中有記錄,則會得到包含所有通知數據,所有預留數據和所有account_movements數據的行,每個數據都以其表名作爲前綴。在查詢之後,您將在代碼中執行相應的代碼,並記錄通知類型並相應地保留預留或account_movement數據。 – Veve 2014-11-03 14:57:05
@JNevill的答案更完整,只允許檢索所需的數據。 – Veve 2014-11-03 14:58:00