Php 如何将逗号分隔值分组为不同的排序逗号分隔值

Php 如何将逗号分隔值分组为不同的排序逗号分隔值,php,mysql,filtering,grouping,distinct,Php,Mysql,Filtering,Grouping,Distinct,我正在尝试解决一个sql问题,想知道我正在尝试做的事情是否可能,如果可能,我将如何去做?我的目标是,如果可能的话,返回一个线程id,其中包含与该线程id相关联的所有唯一值。在下面的示例中,我将展示我已经取得了多大的成就,以及我试图取得的成就 $sql = SELECT `ThreadID`, `PostTags` FROM `ma_posts` WHERE `PostTags` IS NOT NULL AND `PostTags` != '0' AND `PostTags` != ' ' O

我正在尝试解决一个sql问题,想知道我正在尝试做的事情是否可能,如果可能,我将如何去做?我的目标是,如果可能的话,返回一个线程id,其中包含与该线程id相关联的所有唯一值。在下面的示例中,我将展示我已经取得了多大的成就,以及我试图取得的成就

$sql = SELECT `ThreadID`, `PostTags` FROM `ma_posts` WHERE `PostTags` IS NOT   NULL AND `PostTags` != '0' AND `PostTags` != ' ' ORDER BY `ThreadID`
返回当前结果

要返回按字母顺序排序的不同值的筛选分组结果吗

在上面的示例中,名称“Jon”的第二个实例从为ThreadID 14返回的名称中删除,所有名称都压缩为一个字符串/位数据。Barry和Mary名称的第二个和第三个实例将从精简的ThreadID 20中删除

我正在尝试的是可能的吗?如果是,怎么做

我查看了Stackoverflow和web,但没有找到一个能真正说明我所要做的事情的示例。很可能(希望)这是可能的,这样我就不必通过PHP过滤即将出现的结果。这将使生活更加简单

谢谢大家一如既往的帮助
来自Monkee的欢呼

您的数据库似乎没有正常化。您需要将其规范化为第三范式。 无论如何,您不能在查询中使用
distinct
word,这将选择唯一的值

$sql = SELECT distinct `ThreadID`, `PostTags` FROM `ma_posts` WHERE `PostTags` IS NOT NULL 
AND `PostTags` != '0' AND `PostTags` != ' ' ORDER BY `ThreadID`

<>强>你应该考虑规范你的模式。然后,解决方案将变得微不足道。

现在,您可以尝试将逗号分隔的值转换为单独的行,然后应用UPPER、LOWER和SUBSTR组合将字符串的第一个字符转换为大写,其余字符转换为小写(将“barry”转换为“barry”)。最后,使用distinct和order by选项应用GROUP_CONCAT以获得所需的结果

试试这个:

SELECT 
    threadid,
    GROUP_CONCAT(DISTINCT posttag
        ORDER BY posttag
        SEPARATOR ', ') posttags
FROM
    (SELECT 
        threadid,
            CONCAT(UPPER(SUBSTR(posttag, 1, 1)), LOWER(SUBSTR(posttag, 2))) posttag
    FROM
        (SELECT 
        t.threadid,
            SUBSTRING_INDEX(SUBSTRING_INDEX(t.posttags, ', ', t2.i), ', ', - 1) posttag
    FROM
        t
    JOIN (SELECT 1 i UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) t2
    ON CHAR_LENGTH(t.posttags) - CHAR_LENGTH(REPLACE(t.posttags, ', ', '')) >= 2 * (t2.i - 1)) t) t
GROUP BY threadid;
如果posttags中的值可以超过5个,则始终可以在子查询中抛出更多的
UNION ALL


正常化您的模式直到模式正常化,没有“无论如何”@草莓-谢谢您的反馈。我在回答中加了一条注释。我正试图减缓你代表人数的无情增长:-)-我想你将在大约一周内超过我!!