繁体   English   中英

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

[英]How to group comma separated values into distinct sorted comma separated values

我正在尝试计算一段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欢呼

您应该真正考虑规范化架构。 然后,解决方案将变得微不足道。

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

尝试这个:

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

现场演示

看来您的数据库未规范化。 您需要将其规范化为第三范式。 无论如何,您都无法在查询中distinct单词,这将选择唯一的值。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM