2015-02-09 51 views
1

我有多个行选择顺序表所示:MySQL的:基于数量列

product|quantity 

例子:

bread|3 

我需要一个选择,如:

row1- bread 
row2- bread 
row3- bread 

我做成这样:

SELECT product FROM (
    SELECT product FROM order WHERE quantity > 0 UNION ALL 
    SELECT product FROM order WHERE quantity > 1 UNION ALL 
    SELECT product FROM order WHERE quantity > 2 UNION ALL 
    SELECT product FROM order WHERE quantity > 3 
) s; 

它工作得很好。 但他们告诉我最大数量是4. 现在我看到了12,32的订单...所以我不知道最大值。

有没有更好的方法来做到这一点?

+0

请学习后15个职位格式化您的问题。 – 2015-02-09 11:31:30

回答

5

您需要一个表格来生成数字。如果您orders表有足够的行,你可以使用一个变量来生成的数字:

select product 
from orders o join 
    (select (@rn := @rn + 1) as n 
     from orders o cross join (select @rn := 0) vars 
    ) n 
    on n.n <= o.quantity; 
1

这可以通过使用数字表来完成,并且如果你没有一个可以使用所描述的方法this answer即时生成一系列数字。使用该方法,你可以运行一个查询像这样:

-- set up test data 
CREATE TABLE Table1 (product VARCHAR(20), quantity int); 
insert into Table1 values ('bread',3), ('butter',5), ('milk',2); 

-- set up views for number series 
CREATE VIEW generator_16 
AS SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL 
    SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL 
    SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL 
    SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL 
    SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL 
    SELECT 15; 

CREATE VIEW generator_256 
AS SELECT ((hi.n * 16) + lo.n) AS n 
    FROM generator_16 lo, generator_16 hi; 

-- and the actual query 
SELECT product, t.quantity, i.n 
FROM Table1 t 
JOIN generator_256 i 
ON i.n BETWEEN 1 AND t.quantity 
ORDER BY t.product, i.n; 

结果:

| PRODUCT | QUANTITY | N | 
|---------|----------|---| 
| bread |  3 | 1 | 
| bread |  3 | 2 | 
| bread |  3 | 3 | 
| butter |  5 | 1 | 
| butter |  5 | 2 | 
| butter |  5 | 3 | 
| butter |  5 | 4 | 
| butter |  5 | 5 | 
| milk |  2 | 1 | 
| milk |  2 | 2 | 

Sample SQL Fiddle