【问题标题】:How to group comma separated values into distinct sorted comma separated values如何将逗号分隔值分组为不同的排序逗号分隔值
【发布时间】:2017-06-22 07:14:14
【问题描述】:

我正在尝试编写一段 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 和网络,但没有找到真正说明我正在尝试做的事情的示例。可能(希望)这是可能的,因此我不必通过 PHP 过滤传入的结果。这将使生活变得更加简单。

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

【问题讨论】:

  • 规范化你的架构

标签: php mysql filtering grouping distinct


【解决方案1】:

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

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

【讨论】:

  • 在模式标准化之前,没有“无论如何”
【解决方案2】:

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

现在,您可以尝试将逗号分隔的值转换为单独的行,然后应用 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

Live Demo

【讨论】:

  • @Strawberry - 感谢您的反馈。我在答案中添加了注释。
  • 我正在努力减缓你的声望增长的无情 :-) - 我认为你将在大约一周内超过我!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多