[英]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.