我有一个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以这种方式显示表格?谢谢你的帮助。
答案 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。