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

时间:2017-02-05 06:39:58

标签: 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` != ' ' ORDER BY `ThreadID`

退回当前结果
enter image description here

想要返回一个过滤的分组结果,这些结果非常明显地分类

enter image description here

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

我尝试的是什么?如果是这样的话?

我查看了Stackoverflow和网络,但我没有找到一个真正说明我正在尝试做的事情的例子。可能(希望)这是可能的,所以我不必通过PHP过滤即将到来的结果。这将使生活更加简单。

感谢任何人的帮助 来自Monkee的欢呼声

2 个答案:

答案 0 :(得分:1)

您应该考虑规范化架构。解决方案将是微不足道的。

现在,您可以尝试将逗号分隔值转换为单独的行,然后应用UPPER,LOWER和SUBSTR的组合将字符串的第一个字符转换为大写字母并将其转换为小写字母(以转换&# 34;巴里"进入"巴里")。最后使用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;

如果邮政标签中的值超过5个,您可以在子查询中投入更多UNION ALL

Live Demo

答案 1 :(得分:0)

您的数据库似乎没有规范化。您需要将其标准化为第3范式。 无论如何你在查询中不能distinct个单词,它会选择唯一的值。

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