你好我们目前有一个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
答案 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']);
}
}