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:我知道解决这个问题的方法是规范化,但我想这是一个很大的工作,我无法访问更改数据库结构。所以我想如果有一个解决方案让查询工作会很棒! :)谢谢!
答案 0 :(得分:1)
确定。我以前的回答! 下面是一种在MySQL中使用分隔符拆分字符串而不使用存储过程的方法。
要使用该方法,首先需要有另一个表,其数字从1到每行可以存储多少选项。此表将用于连接,因此第一个选项将连接到编号为1的行,第二个选择连接到第2行,等等。所以你需要一个这样的表: ID 1 2 3 4 五 ...
假设你的主表叫做维护,带有一个类别列,你的另一个表叫做另一个带有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