Php MySQL拆分逗号分隔的值并按结果分组
我有下面的桌子 t1 我需要一个查询拆分值,然后按结果分组。像Php MySQL拆分逗号分隔的值并按结果分组,php,mysql,Php,Mysql,我有下面的桌子 t1 我需要一个查询拆分值,然后按结果分组。像 +-------+ |result | +-------+ | A | | B | | C | | D | +-------+ 我试着跟随,但失败了 SELECT SUBSTRING_INDEX(value, ',', 1) as result FROM t1 GROUP BY result 任何人都可以给出更好的提示,谢谢我不是100%清楚您想要输出什么。我认为您的意思是希望返
+-------+
|result |
+-------+
| A |
| B |
| C |
| D |
+-------+
我试着跟随,但失败了
SELECT SUBSTRING_INDEX(value, ',', 1) as result
FROM t1 GROUP BY result
任何人都可以给出更好的提示,谢谢我不是100%清楚您想要输出什么。我认为您的意思是希望返回在逗号分隔列表的任何行中多次出现的值列中的值 在这种情况下,以下查询将生成所需的输出:
SELECT result
FROM (
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(value, ',', a.letter + 1), ',', -1) result
FROM t1
INNER JOIN (SELECT 0 letter UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) a ON LENGTH(REPLACE(value, ',' , '')) <= LENGTH(value) - a.letter
) a
GROUP BY result
HAVING COUNT(result) > 1
ORDER BY result
为什么会有这些结果?在逗号分隔的列表中,每个字母至少出现两次。例如,A在第1行和第4行中出现两次,E在第2、3和4行中出现三次,以此类推
注意:目前仅支持最多4个字母的逗号分隔列表。从你的样本数据中还不清楚这是否足够
编辑以下评论
要获取所有字母的列表,请更改为使用以下SQL:
SELECT result
FROM (
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(value, ',', a.letter + 1), ',', -1) result
FROM t1
INNER JOIN (SELECT 0 letter UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) a ON LENGTH(REPLACE(value, ',' , '')) <= LENGTH(value) - a.letter
) a
GROUP BY result
ORDER BY result
删除have COUNTresult>1将导致返回所有结果。您所说的“按匹配分组”是什么意思?D在任何地方都没有匹配项,但它已包含在您的结果中。它不应该给出-1,无论如何,我的意思是按返回结果值分组。我没有给出-1,我只是想澄清您的问题,正如您所说,如果查询返回正确结果时出现两次字母,那么现在如何处理不出现两次的值?我需要将它们列在同一个结果中:@ash所以你只需要所有字母,不管它们是出现一次、两次还是更多?很不幸yes@ash看到更新的代码谢谢你的工作,我选择这个作为接受的答案,但链接改变了我的想法,我想使用分离值只用于阅读,将改变插入和更新的设计。
result
A
B
C
E
F
G
SELECT result
FROM (
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(value, ',', a.letter + 1), ',', -1) result
FROM t1
INNER JOIN (SELECT 0 letter UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) a ON LENGTH(REPLACE(value, ',' , '')) <= LENGTH(value) - a.letter
) a
GROUP BY result
ORDER BY result