我不确定这是否可行,但是如果它的类型(定义表)是'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吗?
答案 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
可以包含任意数量的attachment
和attachment
(可能)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