Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用一对多关系加入SQL_Sql - Fatal编程技术网

使用一对多关系加入SQL

使用一对多关系加入SQL,sql,Sql,我正在制作一个工具来跟踪给众议院/参议院代表的电话,我这里有两个重要的表格: 重复次数 rep_id rep_name # and more info rep_id status # enum about result of contact comment 评论 rep_id rep_name # and more info rep_id status # enum about result of contact comment 我想查询所有代表加入最近关联的评论,在某些情况下加入特定状

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

重复次数

rep_id
rep_name # and more info
rep_id
status # enum about result of contact
comment
评论

rep_id
rep_name # and more info
rep_id
status # enum about result of contact
comment
我想查询所有
代表
加入最近关联的
评论
,在某些情况下加入特定
状态的
评论
,但可能还没有任何
评论
与该
代表
关联

谢谢

编辑:

使用左连接获得所有代表

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

使用左连接获得所有代表

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

您需要某种方法来区分最新的注释,因此我创建了一个新列:
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

您需要某种方法来区分最新的注释,因此我创建了一个新列:
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

OP希望所有的代表,而不仅仅是那些有评论的人,误读这个问题。在这种情况下,你的解决方案看起来很正确。是的,我自己也读了很多遍。。。您最近的编辑现在显示所有代表及其所有评论,而不是每个代表仅显示一行最新评论。OP希望所有代表,而不仅仅是那些有评论的代表,误读问题。在这种情况下,你的解决方案看起来很正确。是的,我自己也读了很多遍。。。您最近的编辑现在显示了所有代表及其所有注释,而不是每个代表仅显示一行最新的comment.KM,您可以将m.comments添加到第一个SELECT中,将注释添加到子查询和派生表中,并跳过第三个join吗?@Marcus Adams,否。“m”派生表将查找每个代表的最后一行注释。一旦找到最大行,您必须重新连接到同一个表才能获得其余的列。使用GROUP BY时,选择列表中只能显示要分组的列和聚合函数(合并行的函数)。通过按rep_id分组,每个rep_id可以得到一行。如果您尝试按rep_id和注释分组,则每个rep_id和注释可以得到一行(每个rep_id将有多行)。@KM,哦,是的,您是对的。我不知道我在想什么。太好了,谢谢!通常我不会要求其他人做我的SQL工作,但这是为了公共部门的利益而做的无偿工作。您可以看到我在KM中所做的工作,您是否可以将m.comments添加到第一个SELECT,将注释添加到子查询和派生表,并跳过第三个连接?@Marcus Adams,否。“m”派生表将查找每个代表的最后一个注释行。一旦您找到该max行,您必须重新连接到同一个表以获取其余列。使用GROUP BY时,选择列表中只能显示要分组的列和聚合函数(合并行的函数)。通过按rep_id分组,每个rep_id可以得到一行。如果您尝试按rep_id和注释分组,则每个rep_id和注释可以得到一行(每个rep_id将有多行)。@KM,哦,是的,您是对的。我不知道我在想什么。太好了,谢谢!通常我不会要求其他人做我的SQL工作,但这是为了公共部门的利益而做的无偿工作。你可以看到我在这里做什么