mysql select table其中行数取决于两列中的动态值

时间:2013-03-26 13:00:38

标签: mysql

我有一个MySQL表:

id | style  | minsize_id | maxsize_id
-------------------------------------
1  | Jacket | 1          |  3
2  | Pant   | 2          |  4
3  | Hoody  | 0          |  3

我想在minsize_id和maxsize_id(大小可以是0到9之间的任何整数)之间显示每个大小id的额外行,并且新列'size_id'如下所示:

id | style  | size_id
----------------------
1  | Jacket | 1
1  | Jacket | 2
1  | Jacket | 3
2  | Pant   | 2
2  | Pant   | 3
2  | Pant   | 4
3  | Hoody  | 0
3  | Hoody  | 1
3  | Hoody  | 2
3  | Hoody  | 3

如何仅使用MySQL以这种方式显示表格?谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

可以实现的一种方法是将此表连接到包含10行的派生表上,每行一个。例如

SELECT

    yt.id,
    yt.style,
    sizes.size_id

FROM yourTable AS yt

INNER JOIN (
    SELECT 0 AS size_id
    UNION ALL
    SELECT 1 AS size_id
    UNION ALL
    SELECT 2 AS size_id
    UNION ALL
    SELECT 3 AS size_id
    UNION ALL
    SELECT 4 AS size_id
    UNION ALL
    SELECT 5 AS size_id
    UNION ALL
    SELECT 6 AS size_id
    UNION ALL
    SELECT 7 AS size_id
    UNION ALL
    SELECT 8 AS size_id
    UNION ALL
    SELECT 9 AS size_id
) AS sizes
ON sizes.size_id BETWEEN yt.minsize_id AND yt.maxsize_id

但是,如果你有一个带有主键“size_id”的表“sizes”,那么你可以只是INNER JOIN而不是这个派生表。显然,用您想要的任何表名/别名替换yourTable和别名yt

答案 1 :(得分:0)

这是一种方式:

SELECT id, style, size_id
FROM origTable ot
JOIN 
(SELECT @rownum := @rownum + 1 AS size_id
 FROM origTable ot1
 CROSS JOIN origTable ot2,
 (SELECT @rownum := -1) r) s
ON ot.minsize_id <= s.size_id AND ot.maxsize_id >= s.size_id
ORDER BY id, style, size_id
乍一看看起来有点乱,但我会试着解释一下:

MySQL没有像SQL Server这样的row_number函数,所以我使用了一种技术described here来在子查询中人为地创建它。要创建大量的行号,需要在这里有很多行,这样你就可以选择一个已经有很多行的不同表,或者我只是做了原始表的CROSS JOIN - CROSS JOIN通常最终会有很多行。我知道,如果origTable变大,可能会降低性能!

我们需要行号从零开始,子查询选择的内容预先递增1,因此@rownum初始化为-1

请参阅SQL Fiddle Demo