我必须在现有项目上添加一个通知模块。
我的表结构就像在图片上一样。

图片:

如您在图片上看到的,每个通知都有一个类型和一个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/

10-15 12:08