3

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のみを使用してこのようにテーブルを表示するにはどうすればよいですか?助けてくれてありがとう。

4

2 に答える 2

1

これを実現する1つの方法は、このテーブルを、サイズごとに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」がある場合は、この派生テーブルの代わりに、それを内部結合することができます。明らかに、必要なテーブル名/エイリアスに置き換えyourTableてエイリアスを作成します。yt

于 2013-03-26T13:06:14.293 に答える
0

これが1つの方法です:

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にはSQLServerのような機能がないため、ここで説明row_numberする手法を使用して、サブクエリでこれを人為的に作成しています。たくさんの行番号を作成するには、これにたくさんの行が必要です。これにより、すでにたくさんの行がある別のテーブルを選択するか、私が行ったように元のテーブルを選択することができます。行がたくさんあります。私が知っているちょっとしたハックで、大きくなるとパフォーマンスが低下する可能性があります!CROSS JOINCROSS JOINorigTable

行番号はゼロから開始する必要があり、サブクエリによって選択されたものは1ずつ事前にインクリメントされるため、の初期化は@rownumになり-1ます。

SQLFiddleデモを参照してください。

于 2013-03-26T13:33:46.993 に答える