sql >> Database teknologi >  >> RDS >> Mysql

MySQL permutation

Hvert ekstranummer kan være i bundtet eller ej, hvilket gør det til en binær egenskab.
En måde at visualisere kombinationen på er at skabe et ord med en bit for hver ekstra, 1 betyder, at det ekstra er på listen, 0 mener, at det ikke er det.
For eksempel Bench + undershelf + overshelf er 110 (eller 011, hvis den binære streng læses i den modsatte rækkefølge)

Generering af hver kombination af n bit vil give hver kombination af n ekstra, det vil også give hvert tal fra 0 til 2^n - 1 .

Vi kan arbejde tilbage herfra:
1. generer listen over numre fra 0 til 2^n - 1;
2. konverter tallet til binært for at vise kombinationen af ​​ekstrafunktioner
3. match hver bit med en ekstra
4. sammenkæde navnene på ekstramateriale i bundtbeskrivelsen.

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

denne forespørgsel vil fungere op til seks ekstraelementer, så skal den bruge endnu en ciffertabel (et ciffer hver tredje ekstra).

Sådan virker det

Underforespørgslen E tæl antallet af ekstramateriale, dette bruges i C for at begrænse de elementer, der genereres af ciffertabellerne u og t (enhed og tiere) til 2^dim.

Tallet konverteres til binært med BIN(u.N + t.N * 10) , derefter venstre polstret med '0' til antallet af elementer, hvilket genererer en kombinationsbitmap.

For at bruge det genererede bitmap skal hvert ekstramateriale have et falsk id, der matcher en position i det, det er hvad underforespørgslen X er beregnet til.

De to underforespørgsler er JOIN redigeret af det n'te tegn i bitmap:hvis char er 1 er det ekstra i bundtet, LEFT sammenføjet for ikke at miste produktet uden ekstraudstyr.



  1. MySQL en-til-mange joinforbindelse med Group By returnerer kun én observation

  2. Flydende NHibernate og PostgreSQL, SchemaMetadataUpdater.QuoteTableAndColumns - System.NotSupportedException:Den specificerede metode understøttes ikke

  3. IF-funktion i H2 for MySQL-kompatibilitet

  4. brug af GROUP BY i mysql 8