如何根据加入联接的值有条件地加入?

时间:2013-05-13 18:38:00

标签: mysql join

我不确定这是否可行,但是如果它的类型(定义表)是'main'(如果它有附件,但是它的类型是,那么我想要取回所有记录以及它们的附件)别的,我希望它是NULL。

SELECT r.*
FROM record r
LEFT JOIN attachment d on d.record_id = r.id
LEFT JOIN attachment_type at on d.type_id = at.id
WHERE at.name = "main"
GROUP BY r.id

我会在这里对数据进行一些重新设计,但这是不可能的。在进行连接之前,我可以使用子查询来获取id吗?

1 个答案:

答案 0 :(得分:1)

我不知道您的附件列表是什么样的(除了它有type列之外),但是这样的东西应该是接近的,这意味着(a)它将返回所有行, (b)如果类型为main,则返回的附件值将为null:

SELECT
  r.*,
  CASE WHEN at.name = 'main' THEN d.whatever ELSE NULL END AS attach_thingie
FROM record r
LEFT JOIN attachment d on d.record_id = r.id
LEFT JOIN attachment_type at on d.type_id = at.id

而且,正如上面评论中提到的@FreshPrinceOfSO,我认为不需要GROUP BY

还有一件事:基于我可以从查询中推断出的内容,我没有看到三个表中有任何明显的设计问题。我读了它,因为record可以包含任意数量的attachmentattachment(可能)type。如果这是你的要求你应该没问题。


附录:根据attachment.id列为每条记录选择最多一个附件:

SELECT r.*, d.whatever
FROM record r
LEFT JOIN
  (
    SELECT attachment.record_id, MAX(attachment.id) AS Max_ID
    FROM attachment
    INNER JOIN attachment_type at ON attachment.type_id = at.id
    WHERE at.name = 'main'
    GROUP BY attachment.record_id
  ) att ON r.id = att.record_id
LEFT JOIN attachment d ON d.id = att.Max_ID