如何删除重复的列和组列

时间:2014-05-27 09:51:49

标签: php mysql

你好我们目前有一个MySQL查询工作得非常好,但我唯一不喜欢的是当我得到返回的数据时,除了行的最后一列之外,有些行会重复。

我想原因是因为当我选择包括左连接在内的所有内容时,commenttext列包含用户提交的帖子的数据。

例如)如果我发布id为1的帖子,并且5个人对该帖子发表评论,MySQL查询将显示5行,每列中的所有数据都相同,除了最后一列包含与该帖子相关的不同评论帖子。

到目前为止,这是我的MySQL查询。我怎样才能把它带回来,不会带来重复的数据,只有用帖子的id组成的注释,或者如何将所有注释存储到数组中,这样当我运行foreach循环时,我可以运行用while循环注释数组里面。我使用foreach循环的原因是用html导出数据。

SELECT
    b.id
    , b.from_user
    , b.dateadded
    , b.posttype
    , b.posttext
    , b.photoname
    , b.blahchoice
    , b.commentschoice
    , b.mood
    , c.defaultphoto
    , d.firstn
    , d.lastn
    , e.status
    , f.topostid
    , f.commenttext 
FROM
    t_board b 
INNER JOIN
    t_userprofiles c ON b.from_user = c.user_id  
INNER JOIN
    t_users d ON b.from_user = d.id
INNER JOIN
    t_friendship e ON e.friend_ids = b.from_user
LEFT JOIN
    t_postcomments f ON f.topostid = b.id
WHERE
    e.status = 'Friend' 
    AND e.user_ids = :id
ORDER BY
    b.id DESC

2 个答案:

答案 0 :(得分:2)

执行此操作的一种方法是group_concat()注释,当您在循环explode()内运行注释,然后执行foreach以显示ID下的注释

SELECT b.id, 
b.from_user, 
b.dateadded, 
b.posttype, 
b.posttext, 
b.photoname, 
b.blahchoice, 
b.commentschoice, 
b.mood, 
c.defaultphoto, 
d.firstn, 
d.lastn, 
e.status, 
f.topostid, 
group_concat(f.commenttext) as  commenttext
FROM t_board b 
INNER JOIN t_userprofiles c ON b.from_user = c.user_id  
INNER JOIN t_users d ON b.from_user = d.id
INNER JOIN t_friendship e ON e.friend_ids = b.from_user
LEFT JOIN t_postcomments f ON f.topostid = b.id
WHERE e.status = 'Friend' 
AND e.user_ids = :id
group by b.id
ORDER BY b.id DESC

请注意,当您在PHP commenttext上执行查询时,所有内容都将以逗号分隔,并且在循环内部为每个b.id获取数据,您将以逗号分隔该ID的所有注释 - 分隔字符串,您可以将其爆炸以生成另一个数组并显示它们。

您的一些评论中也可能包含逗号,因此您可能需要为group_concat提供一个分隔符,如下所示,或者可以选择任何自定义运算符。

group_concat(f.commenttext SEPARATOR '||' ) as  commenttext

用||

爆炸数据
  

注意:结果被截断为给定的最大长度   group_concat_max_len系统变量,其默认值为   1024   http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

答案 1 :(得分:2)

在PHP fetch循环中合并相同帖子的条目:

$results = array();
while ($row = $stmt->fetch()) {
    if (isset($results[$id]) {
        $results[$id]['comments'][] = $row['commenttext'];
    } else {
        $row[$id] = $row;
        $row['comments'] = array($row['commenttext']);
    }
}