我必须在现有项目上添加一个通知模块。
我的表结构就像在图片上一样。
图片:
如您在图片上看到的,每个通知都有一个类型和一个releatedID。
类型1 =取消预订,相关的ID是“预订”表上的ID
类型3 =帐户余额低于给定的最小值。限制,因此releatedID是“ account_movements”上的ID
表
我想要做的是有条件的连接,以避免2个不同的sql查询;
获取属于该人的所有通知
根据“ notification.Type”从不同的表获取通知详细信息
所以问题是我可以在一个查询中做到吗?
最佳答案
像下面这样的东西应该起作用。基本上,您指定将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
表中的列合并为一个列,而不必担心丢失或重复任何数据。关于mysql - SQL条件连接在不同的表上,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26715656/