2014-11-03 51 views
0

我必須在現有的項目上添加一個通知模塊。 我的表格結構就像在照片上。Sql條件在不同的表上加入

圖片:conditionalJoin

,你在圖片上的所有通知都有一個類型和releatedID看到。

類型1 =預約被取消,相關型號ID是「保留」表

類型3 =帳戶餘額是給定分鐘下的ID。限制如此相關的ID是「account_movements」上的ID 表

我想要做的是一個條件連接,以避免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()加入只是爲了顯示,自連接是相互排斥的,您可以安全地從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

如果reservation和account_movements表中的某個條目的ID等於相關ID,會發生什麼情況?我會不會比兩張桌子上的作品都變得更好? – Alchalade 2014-11-03 14:49:56

+0

如果在預訂和account_movements中有記錄,則會得到包含所有通知數據,所有預留數據和所有account_movements數據的行,每個數據都以其表名作爲前綴。在查詢之後,您將在代碼中執行相應的代碼,並記錄通知類型並相應地保留預留或account_movement數據。 – Veve 2014-11-03 14:57:05

+0

@JNevill的答案更完整,只允許檢索所需的數據。 – Veve 2014-11-03 14:58:00