【问题标题】:JOIN in SQL with one-to-many relationship在 SQL 中加入一对多关系
【发布时间】:2010-03-19 02:54:28
【问题描述】:

我正在制作一个工具来跟踪对众议院/参议院代表的电话,我在这里有 2 个重要表:

代表

rep_id
rep_name # and more info

cmets

rep_id
status # enum about result of contact
comment

我想查询所有reps 加入最近关联的comments 并在某些情况下加入特定statuscomments,但可能没有任何comments 与该rep 关联还没有。

谢谢!

【问题讨论】:

    标签: sql


    【解决方案1】:

    您需要一些方法来区分最新评论,因此我创建了一个新列:comments.commentDate,使用该列或某些自动编号/身份使用如下查询:

    SELECT
        r.*,c.*
        FROM reps r
            LEFT OUTER JOIN (SELECT
                                 rep_id,MAX(commentDate) AS MaxDate
                                 FROM comments
                                 GROUP BY rep_id
                            ) m On r.rep_id=m.rep_id
            LEFT OUTER JOIN comments c ON r.rep_id=c.rep_id AND m.MaxDate=c.commentDate
        ORDER BY r.rep_name
    

    【讨论】:

    • KM,第一个SELECT加m.cmets,子查询和派生表加cmets,第三个join可以跳过吗?
    • @Marcus Adams,否。“M”派生表查找每个代表的最后一个评论行。找到最大行后,您必须重新加入同一个表以获取剩余的列。使用 GROUP BY 时,可以出现在选择列表中的唯一列是要分组的列和聚合函数(组合行的函数)。通过按 rep_id 分组,您可以得到每个 rep_id 一行。如果您尝试按 rep_id 和评论进行分组,则每个 rep_id 和评论都会得到一行(每个 rep_id 会有很多行)。
    • @KM,哦,是的,你是对的。我不知道我在想什么。
    • 太好了,谢谢!通常我不会要求其他人做我的 SQL 工作,但这是为了公共部门的利益而进行的无偿工作。你可以在pledge.santiance.com 看到我在做什么
    【解决方案2】:

    编辑:

    使用左连接获取所有代表,

    SELECT reps.rep_id, comments.comment
    FROM reps
    LEFT JOIN comments
    ON reps.rep_id=comments.rep_id
    

    【讨论】:

    • OP 想要所有代表,而不仅仅是那些有 cmets 的代表
    • 抱歉,误读了问题。 KM,在这种情况下,您的解决方案看起来很合适。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多