2010-03-18 49 views
0

我正在做一个工具来跟踪到房子/参议院代表电话,我有2个表重要的位置:加入SQL一个一对多的关系

代表

rep_id 
rep_name # and more info 

评论

rep_id 
status # enum about result of contact 
comment 

我想查询所有reps加入最新的相关comments以及在某些情况下加入comments的特定status,但是可能没有任何comments与该rep相关联。

谢谢!

回答

4

你需要一些方法来辨别最新的评论,所以我做了一个新的列: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 
+0

KM,你可以添加m.comments到第一个SELECT,为子查询和派生表添加注释,并跳过第三个连接? – 2010-03-18 19:00:30

+1

@Marcus Adams,编号“M”派生表查找每个代表的最后评论行。一旦找到最大行数,您必须回到同一个表以获取剩余的列。使用GROUP BY时,可以出现在选择列表中的唯一列是用于分组和合并函数(合并行的函数)的列。通过rep_id分组,每个rep_id获得一行。如果尝试按rep_id和comment进行分组,则每个rep_id和comment(每个rep_id都会有很多)会得到一行。 – 2010-03-18 19:06:53

+0

@KM,噢,你说得对。我不知道我在想什么。 – 2010-03-18 19:10:45

1

编辑:

使用LEFT JOIN来获取所有代表,

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

OP希望所有的代表,而不仅仅是那些有意见 – 2010-03-18 18:50:10

+0

对不起,误解的问题。知识管理,你的解决方案在这种情况下看起来很重要 – 2010-03-18 18:54:09

+0

是的,我不得不一次阅读它自己...你最新的编辑现在显示所有他们的评论代表,而不是每个代表与最新的评论单行。 – 2010-03-18 19:08:10