2012-12-17 102 views
1

我有两个表用于存储产品和其他用于存储订单列表。查询以逗号分隔计数值

 
CREATE TABLE ProductsList(ProductId INT NOT NULL PRIMARY KEY, 
          ProductName VARCHAR(50)) 


INSERT INTO ProductsList(ProductId, ProductName) 
        VALUES(1,'Product A'), 
         (2,'Product B'), 
         (3,'Product C'), 
         (4,'Product D'), 
         (5,'Product E'), 
         (6,'Product F'), 
         (7,'Product G'), 
         (8,'Product H'), 
         (9,'Product I'), 
         (10,'Product J');       

CREATE TABLE OrderList(OrderId INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
         EmailId VARCHAR(50), 
         CSVProductIds VARCHAR(50)) 


INSERT INTO OrderList(EmailId, CSVProductIds)      
       VALUES('[email protected]', '2,4,1,5,7'), 
        ('[email protected]', '5,7,4'), 
        ('[email protected]', '2'), 
        ('[email protected]', '8,9'), 
        ('[email protected]', '4,5,9'), 
        ('[email protected]', '1,2,3'), 
        ('[email protected]', '9,10'), 
        ('[email protected]', '1,5'); 

输出

ItemName    NoOfOrders 
Product A    3 
Product B    3 
Product C    1 
Product D    3 
Product E    4 
Product F    0 
Product G    2 
Product H    1 
Product I    3 
Product J    1 

的订单列表存储ItemsId以逗号为每一位客户谁地方order.Like这个我在我的数据库表有超过40K的记录现在

分隔值我被分配了创建报告的任务,我应该在其中显示项目和没有人订购的项目如下所示

我使用查询如下在我的PHP中b响一个一个的订单并存储在数组中。

SELECT COUNT(PL.EmailId) 
    FROM OrderList PL 
WHERE CSVProductIds LIKE '2' OR 
     CSVProductIds LIKE '%,2,%' OR 
     CSVProductIds LIKE '%,2' OR 
     CSVProductIds LIKE '2,%'; 

1.Is有可能得到同出通过使用MySQL查询使用,如单查询

2.Does把减慢分贝时,表中有没有更多的记录,即40K行

+0

我其实我误解了这个问题对不起任何方式..! – Chella

回答

6

是的,使用带引导通配符的LIKE强制它执行表扫描,即读取表中的每一行。桌子越大,它会越慢。例如,它可能会慢几百或几千倍!

这是为什么要在VARCHAR中存储逗号分隔列表并希望访问单个元素的几个原因之一,这对于关系数据库来说是一个糟糕的设计。

另见我的回答Is storing a comma separated list in a database column really that bad?

你应该做的,而不是为定义OrderList表来存储一个对电子邮件和产品ID的。如果订单由多个产品组成,则必须存储多行。但这意味着您可以随时找到您要查找的单个产品,计算有多少人购买了该产品等,并且可以通过定义索引来快速完成这些查询。

反对在单个列中存储列表的规则称为First Normal Form

+0

+1为你的伟大的知识,对不起,我不能打upvote 10次 –

+0

+1给出了很好的解释。 –

0

1.使用正则表达式,但认为它只会改变你的应用程序代码而不是数据库代码。
2.是的,它通常会影响性能,即shortly mentioned herehere's a solution可能会有所帮助。

-1

你可以找到它在一个像下面

SELECT COUNT(PL.EmailId) 
    FROM OrderList PL 
WHERE FIND_IN_SET(2, CSVProductIds) 
+0

这个查询有什么错误?在给予投票表决之前解释它... – Codesen