3

我有一个 MySQL 表:

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

我想为minsize_id 和 maxsize_id 之间的每个尺寸 id 显示一个额外的行(尺寸可以是 0 到 9 之间的任何整数),以及一个新列“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 以这种方式显示表?谢谢你的帮助。

4

2 回答 2

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

于 2013-03-26T13:06:14.293 回答
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 没有row_numberSQL Server 那样的功能,因此我使用此处描述的技术在子查询中人为地创建它。要创建大量行号,其中需要有很多行,因此您可以选择一个已经有很多行的不同表,或者像我所做的那样,只做一个CROSS JOIN原始表 -CROSS JOIN通常会结束有很多行。我知道有点黑客攻击,如果origTable变大可能会降低性能!

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

请参阅SQL Fiddle 演示

于 2013-03-26T13:33:46.993 回答