sql >> Databasteknik >  >> RDS >> Mysql

MySQL-permutation

Varje extra kan vara i paketet eller inte, vilket gör det till en binär egenskap.
Ett sätt att visualisera kombinationen är att skapa ett ord med en bit för varje extra, 1 betyder att extra finns i listan, 0 menar att det inte är det.
Till exempel Bench + undershelf + overshelf är 110 (eller 011 om den binära strängen läses i motsatt ordning)

Att generera varje kombination av n bitar kommer att ge varje kombination av n extra, det kommer också att ge varje nummer från 0 till 2^n - 1 .

Vi kan arbeta tillbaka härifrån:
1. generera listan med nummer från 0 till 2^n - 1;
2. konvertera talet till binärt, för att lista kombinationen av extrafunktioner
3. matcha varje bit med en extra
4. sammanfoga namnen på extramaterialen i paketbeskrivningen.

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

den här frågan kommer att fungera upp till sex extrafunktioner, sedan behöver den ytterligare en siffertabell (en siffra var tredje extra).

Så fungerar det

Underfrågan E räkna antalet extra, detta används i C för att begränsa de element som genereras av siffertabellerna u och t (enhet och tiotal) till 2^dim.

Numret konverteras till binärt med BIN(u.N + t.N * 10) , sedan vänster utfylld med '0' till antalet element, vilket genererar en kombinationsbitmapp.

För att använda den genererade bitmappen behöver varje extramaterial ett falskt id som matchar en position i den, det är vad underfrågan X är avsedd för.

De två underfrågorna är JOIN ed av det n:te tecknet i bitmappen:om tecknet är 1 finns det extra i paketet, LEFT sammanfogad för att inte tappa produkten utan extrafunktioner.



  1. Välj högsta 3 poäng varje dag för varje användare

  2. Hur man använder Global Temporary Table i Oracle Procedur?

  3. SQL Server Index Användningsstatistik

  4. Ta reda på vilken partition ett givet värde skulle mappas till i SQL Server (T-SQL)