如何计算mysql中的重复数据

时间:2015-09-14 07:20:13

标签: mysql

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:我知道解决这个问题的方法是规范化,但我想这是一个很大的工作,我无法访问更改数据库结构。所以我想如果有一个解决方案让查询工作会很棒! :)

谢谢!

1 个答案:

答案 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