id | category
001 | 1000
001 | 300
002 | 500
003 | 200;300;100
004 | 100;300
005 | 200;3000
结果应该是
Category | Total
1000 | 1
300 | 3
500 | 1
200 | 2
100 | 2
我如何才能得出这样的结果呢?我看到了一些我需要使用find_in_set
的东西,但它对我来说有点复杂。
在这方面的任何帮助都将非常感谢!
PS:我知道这个问题的解决方案是标准化,但我想这是一项很大的工作,而且我没有权限更改数据库结构。所以我想,如果有一个解决方案可以让查询工作起来,那就太好了!:)
谢谢你!
发布于 2015-09-14 15:54:27
好的。我对上一个答案的回答!下面是一种在MySQL中使用分隔符拆分字符串的方法,而无需使用存储过程。
要使用该方法,首先需要有另一个表,该表具有从1到每行可以存储的任意多个选项的数字。这个表将用在连接中,这样第一个选择将连接到编号为1的行,第二个选择连接到第二行,依此类推。因此,您需要一个这样的表: id 1 2 3 4 5 ...
假设您的主表称为具有类别列的maintable,而另一个表名为具有id列的其他表(尽管您可以使用任何具有序列号或id号的表)。
这是我用来创建这个示例的表:
CREATE TABLE maintable (id INT, category VARCHAR(255));
INSERT INTO maintable VALUES (1, '1000'), (2, '300'), (3, '500'), 4, '200;300;100'), (4, '100;300'), (4, '200;3000');
CREATE TABLE othertable (id INT);
INSERT INTO othertable VALUES (1), (2), (3), (4), (5), (6), (7), (8);
这是mysql代码:
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(maintable.category,';',othertable.id),';',-1) AS category,
COUNT(*) AS numtimes
FROM maintable INNER JOIN othertable ON
(LENGTH(category)>0 AND SUBSTRING_INDEX(SUBSTRING_INDEX(category,';',othertable.id),';',-1)
<> SUBSTRING_INDEX(SUBSTRING_INDEX(category,';',othertable.id-1),';', -1))
GROUP BY category ORDER BY category;
我得到了这样的结果:
category numtimes
100 2
1000 1
200 3
200 2
300 1
500 1
https://stackoverflow.com/questions/32559170
复制相似问题