sql >> Databáze >  >> RDS >> Mysql

Permutace MySQL

Všechny doplňky mohou být v balíčku nebo ne, což z toho činí binární vlastnost.
Způsob, jak si kombinaci představit, je vytvořit slovo s bitem pro každou extra, 1 znamená, že doplněk je v seznamu, 0 znamená, že tomu tak není.
Například Bench + undershelf + overshelf je 110 (nebo 011, pokud se binární řetězec čte v opačném pořadí)

Generování každé kombinace n bitů dá každou kombinaci n extra, dá také každé číslo od 02^n - 1 .

Můžeme pracovat zpět odtud:
1. vygenerujte seznam čísel z 02^n - 1;
2. převeďte číslo na binární, zobrazí se kombinace extra
3. sladit každý kousek s extra
4. zřetězit názvy doplňků v popisu balíčku.

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

tento dotaz bude fungovat až se šesti doplňky, pak bude potřebovat další tabulku číslic (jedna číslice každé tři doplňky).

Jak to funguje

Poddotaz E spočítat počet doplňků, to se používá v C pro omezení prvků generovaných tabulkami číslic u a t (jednotka a desítky) na 2^dim.

Číslo je převedeno na binární pomocí BIN(u.N + t.N * 10) , pak doleva doplněn o '0' k počtu prvků, čímž se vygeneruje kombinovaná bitmapa.

Chcete-li použít vygenerovanou bitmapu, každý doplněk potřebuje falešné ID, které bude odpovídat pozici v něm, to je poddotaz X je určeno pro.

Dva dílčí dotazy jsou JOIN ed pomocí n-tého znaku bitmapy:pokud je znak 1, další je ve svazku, LEFT spojené, aby se produkt neztratil bez doplňků.



  1. Kontrola, zda je třeba aktualizovat sloupec bez LOB

  2. MariaDB JSON_ARRAY() Vysvětleno

  3. Chyba (blízko ON na pozici 25) při importu tabulky pro WORDPRESS (Chyba cizího klíče)

  4. Použití GROUP_CONCAT na poddotaz v MySQL