Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.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
Php 如何删除重复列和组列_Php_Mysql - Fatal编程技术网

Php 如何删除重复列和组列

Php 如何删除重复列和组列,php,mysql,Php,Mysql,大家好,我现在有一个MySQL查询,它运行得非常好,但我唯一不喜欢的是,当我得到返回的数据时,除了行的最后一列之外,有些行是重复的 我想原因是因为当我选择包括左连接在内的所有内容时,commenttext列包含用户提交的帖子的数据 例如,如果我发布了一篇id为1、5人的帖子,那么该帖子的MySQL查询将显示5行,每列中的所有数据都相同,但最后一列包含与该帖子相关的不同评论 到目前为止,这里是我的MySQL查询。如何使它不返回重复的数据,而只返回与帖子id分组的注释,或者如何将所有注释存储到一个数

大家好,我现在有一个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

一种方法是
group\u 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(f.commenttext SEPARATOR '||' ) as  commenttext
并使用||

注意:结果将被截断为给定的最大长度 group_concat_max_len系统变量,其默认值为 1024


一种方法是
group\u 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(f.commenttext SEPARATOR '||' ) as  commenttext
并使用||

注意:结果将被截断为给定的最大长度 group_concat_max_len系统变量,其默认值为 1024


在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']);
    }
}

在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']);
    }
}


你能把查询的格式设置得更好吗?另外,您可能想为我们创建一个用于处理可能的重复项,为什么不运行多个查询并在php中执行呢?我这样做了,但我想让ajax更容易一次获取@AliendroidI不影响您的ajax,没有人说您在一次调用中只能运行一个查询@this.tony能否更好地格式化查询?另外,您可能想为我们创建一个用于处理可能的重复项,为什么不运行多个查询并在php中执行呢?我这样做了,但我想让ajax更容易一次获取@AliendroidI不影响您的ajax,没有人说您在一次调用中只能运行一个查询@this.tony如果任何注释包含逗号,则此选项将无法正常工作。您需要指定一个不会出现在任何注释中的分隔符。而且您可能需要将
group_concat_max_len
设置得非常大,以避免截断。是的,我正要更新答案,我已经更新了答案。否,您不需要更改DB列中的任何内容,因为数据在选择时是浓缩的,但是,如果注释的大小非常大,那么您可能需要更改mysql设置,将group_concat_max_len值增加到一个大数字,然后重新启动mysql。如果您的注释很小,并且在concat之后少于1024个字符,则不需要它。在debian和windows WAMP中,配置文件位于
/etc/mysql/my.cf
上,您可以通过GUI对其进行修改。我测试它工作正常,现在,假设我想获取评论的数据,我将如何处理,比如谁发布了评论以及评论是在什么时候发布的?嗯,我想这将不适用于此查询,因为它是一对多查询,您将保留多行,即对于每个评论,您将有一行。注释以及用户和日期时间也可以被浓缩,但这需要一个子查询来执行操作。如果任何注释包含逗号,这将无法正常工作。您需要指定一个不会出现在任何注释中的分隔符。而且您可能需要将
group_concat_max_len
设置得非常大,以避免截断。是的,我正要更新答案,我已经更新了答案。否,您不需要更改DB列中的任何内容,因为数据在选择时是浓缩的,但是,如果注释的大小非常大,那么您可能需要更改mysql设置,将group_concat_max_len值增加到一个大数字,然后重新启动mysql。如果您的注释很小,并且在concat之后少于1024个字符,则不需要它。在debian和windows WAMP中,配置文件位于
/etc/mysql/my.cf
上,您可以通过GUI对其进行修改。我测试它工作正常,现在,假设我想获取评论的数据,我将如何处理,比如谁发布了评论以及评论是在什么时候发布的?嗯,我想这将不适用于此查询,因为它是一对多查询,您将保留多行,即对于每个评论,您将有一行。此外,还可以将注释与用户和日期时间联系起来