如何从左连接中删除冗余字段

时间:2013-02-07 01:42:45

标签: mysql sql jsp

我正在进行以下查询以从两个不同的表中获取消息和图像。 这里有一条消息可以有多个图像

为此我写了以下查询,该查询正常工作并显示以下结果

select msg.messageid, msg.message, msg.sentby, msg.adddate, 
p_i.image_id ,p_i.small_pic_path 
from user_messages as msg
LEFT JOIN post_images as p_i
on msg.messageid=p_i.messageid
where msg.messageid='zpx1btrpvpa1360154523078'
order by msg.adddate desc

输出

 messageid  message  sentby  adddate  image_id  small_pic_path
   1         abc      aa      12/2/12   6          /sdf/sdf
   1         abc      aa      12/2/12   7          /asdf/df
   1         abc      aa      12/2/12   8          /cxd/sxc
   1         abc      aa      12/2/12   9          /zz/szz

此处 messaged messageby adddate 正在重复并在jsp页面中显示 显示总共4条不同的信息。

但是我希望用相关的消息详细信息显示4个imageid和small_pic_path(基于消息ID)

我想显示为

1)消息         sentBy
        这条消息的所有small_pic_path消息都是

1)消息         sentBy
        这条消息的所有small_pic_path消息都是

2)消息         sentBy
        这条消息的所有small_pic_path消息都是

3)消息         sentBy
        这条消息的所有small_pic_path消息都是

2 个答案:

答案 0 :(得分:1)

这是使用JOIN时的预期行为,您获得了交叉产品。

如果要折叠行,请使用GROUP BY和相应的列。在你的情况下,它可能是:

GROUP BY messageid, message, sentry, adddate

答案 1 :(得分:1)

如果没有真正了解您的要求,请写下:

  

但我想用一条消息显示4个imageid和small_pic_path   细节

您想如何显示这些记录?

假设您的意思是在同一行,那么请查看使用GROUP_CONCAT

SELECT msg.messageid, msg.message, msg.sentby, msg.adddate, 
  group_concat(p_i.image_id separator ';') imageids,
  group_concat(p_i.small_pic_path separator ';') picpaths
FROM ...

这是展示结果的SQL Fiddle

如果您想以不同的方式显示结果,可能应该通过UI处理。

祝你好运。