MySQL计算同一列中多个值的存在

时间:2013-10-07 08:22:01

标签: mysql sql

我有一个名为Customers的表,其中包含CustID列,另一个名为ProductCode。有33种可能的产品(编号为1至33),每个客户可以有任何产品组合。每个客户都有一行,每个客户拥有的所有产品都显示在ProductCode列中,其间有空格,即:

CUSTID     PRODUCTCODE  
------     -----------

001        3 12 18 22 32  
002        9 6 18 36  
003        3 6 7 26  
004        9 11 33   
005        6 21 28 29 30 31  
006        1 3 6 21 30 31  

我需要能够对每个产品进行统计并添加代码的文本说明:

ProdCode    Description       Count  
~~~~~~~~    ~~~~~~~~~~~       ~~~~~  
1           Lawnmower         1  
3           Spade             3  
6           Clippers          4  
etc

谢谢!

3 个答案:

答案 0 :(得分:0)

从不,永远不会在一列中存储多个值!

如您所见,这只会导致问题。请使用附加表格标准化您的数据库结构

customer_products
CUSTID     PRODUCTCODE  
------     -----------
001        3
001        12
001        18
---
002        9
002        6
...

然后,您可以从PRODUCTCODE表中删除customer列。

答案 1 :(得分:0)

一种解决方案是将架构更改为包含两列: -

1)客户ID 2)产品标识

所以数据看起来像这样: -

cust_id| product_id

001    | 3
001    | 6
002    | 9

... ...

所以现在在mysql查询中你可以使用像

这样的查询
Select product_id,count(*) as num_products from table_name group by product_id;

希望这有帮助。

如果您无法更改架构,则必须获取数据并使用脚本语言,您必须根据需要对其进行处理。

答案 2 :(得分:0)

试试这个:

CREATE TABLE ord (custid VARCHAR(3), productcode VARCHAR(40));

INSERT INTO ord VALUES ('001', '3 12 18 22 32');
INSERT INTO ord VALUES ('002', '9 6 18 36');
INSERT INTO ord VALUES ('003', '3 6 7 26');
INSERT INTO ord VALUES ('004', '9 11 33');
INSERT INTO ord VALUES ('005', '6 21 28 29 30 31');
INSERT INTO ord VALUES ('006', '1 3 6 21 30 31');

CREATE TABLE products (code VARCHAR(2));

INSERT INTO products VALUES ('3');
INSERT INTO products VALUES ('12');
INSERT INTO products VALUES ('18');
INSERT INTO products VALUES ('22');
INSERT INTO products VALUES ('32');
INSERT INTO products VALUES ('9');
INSERT INTO products VALUES ('6');
INSERT INTO products VALUES ('31');

CREATE TABLE ord_prod (code VARCHAR(2), count_of_products INT) AS
  SELECT p.code, 
        (SELECT COUNT(1)
           FROM ord o
         WHERE INSTR(CONCAT(' ', o.productcode, ' '), CONCAT(' ', p.code, ' ')) > 0) AS count_of_products
    FROM products p;

检查SQLFiddle:http://sqlfiddle.com/#!2/a7f94/1

根据需要更改您的类型,添加其余产品,添加说明等。