0

我不确定这是否可行,但我想取回所有记录及其附件,如果它的类型(定义表)是“主”(如果它有附件,但它的类型是别的东西,我希望它为 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 吗?

4

1 回答 1

1

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

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(也许)有 a 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
于 2013-05-13T18:49:38.800 回答