sql >> データベース >  >> RDS >> Mysql

MySQLの順列

    すべてのエクストラはバンドルに含まれる場合と含まれない場合があり、バイナリプロパティになります。
    組み合わせを視覚化する方法は、エクストラごとにビットを含む単語を作成することです。1 エクストラがリストにあることを意味します、0 そうではないことを意味します。
    たとえば、Bench + undershelf + overshelf は110(または、バイナリ文字列が逆の順序で読み取られる場合は011)

    nビットのすべての組み合わせを生成すると、n個のエクストラのすべての組み合わせが得られ、0からのすべての数値も得られます。 2^n - 1へ 。

    ここから戻ることができます:
    1。 0から番号のリストを生成します 2^n - 1へ;
    2。数値を2進数に変換して、エクストラの組み合わせを一覧表示します
    3。すべてのビットを追加の
    4と一致させます。バンドルの説明でエクストラの名前を連結します。

    SELECT CONCAT(b.Name
                , COALESCE(CONCAT(' + '
                                , GROUP_CONCAT(x.Name SEPARATOR ' + '))
                         , '')) Combination
    FROM   (SELECT p.Name, p.id
                         , LPAD(BIN(u.N + t.N * 10), e.Dim, '0') bitmap
                    FROM   Products p
                           CROSS JOIN (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) u
                           CROSS JOIN (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) t
                           INNER JOIN (SELECT COUNT(1) Dim
                                           , `Parent ID` pID
                                       FROM Extra) E ON e.pID = p.ID
                    WHERE  u.N + t.N * 10 < Pow(2, e.Dim)
           ) B
           LEFT  JOIN (SELECT @rownum := @rownum + 1 ID
                            , `Parent ID` pID
                            , Name
                       FROM   Extra
                            , (Select @rownum := 0) r) X
                              ON x.pID = b.ID
                             AND SUBSTRING(b.bitmap, x.ID, 1) = '1'
    GROUP BY b.Name, b.bitmap
    

    このクエリは最大6つのエクストラで機能し、その後、別の数字テーブルが必要になります(3つのエクストラごとに1つの数字)。

    仕組み

    サブクエリE エクストラの数を数えます。これはCで使用されます 数字テーブルuによって生成される要素を制限します およびt (単位と数十)から2^dim。

    数値はBIN(u.N + t.N * 10)によってバイナリに変換されます 、次に要素数に「0」を付けたままにして、組み合わせビットマップを生成します。

    生成されたビットマップを使用するには、各エクストラにその中の位置と一致する偽のIDが必要です。これが、サブクエリ Xです。 のためのものです。

    2つのサブクエリはJOINです。 ビットマップのn番目の文字で編集:文字が1の場合、余分な文字はバンドルに含まれ、LEFT 余分なものなしで製品を失わないように参加しました。



    1. MySQL ASIN()関数–数値のアークサインを返します

    2. アップグレードの問題中に破損したSQLデータベースを修正

    3. UTF8ワークフローPHP、MySQLの要約

    4. カーソルの行タイプ型オブジェクトを使用したOracle一括収集の例