Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Permutacja MySQL

Wszystkie dodatki mogą znajdować się w pakiecie lub nie, co sprawia, że ​​jest to właściwość binarna.
Sposób wizualizacji kombinacji polega na utworzeniu słowa z bitem dla każdego dodatku, 1 oznacza, że ​​dodatek jest na liście, 0 oznacza, że ​​tak nie jest.
Na przykład Bench + undershelf + overshelf wynosi 110 (lub 011, jeśli ciąg binarny jest odczytywany w odwrotnej kolejności)

Generowanie każdej kombinacji n bitów da każdą kombinację n dodatków, da także każdą liczbę od 0 do 2^n - 1 .

Możemy wrócić stąd:
1. wygeneruj listę numerów od 0 do 2^n - 1;
2. przekonwertuj liczbę na binarną, aby wyświetlić kombinację dodatków
3. dopasuj każdy bit z dodatkowym
4. połącz nazwy dodatków w opisie pakietu.

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

to zapytanie będzie działać do sześciu dodatków, wtedy będzie potrzebna kolejna tabela cyfr (jedna cyfra na trzy dodatki).

Jak to działa

Podzapytanie E policz liczbę dodatków, jest to używane w C aby ograniczyć elementy generowane przez tablice cyfr u i t (jednostki i dziesiątki) na 2^wymiar.

Liczba jest konwertowana na binarną przez BIN(u.N + t.N * 10) , a następnie w lewo dopełnione cyfrą „0” do liczby elementów, tworząc kombinowaną bitmapę.

Aby użyć wygenerowanej mapy bitowej, każdy dodatek potrzebuje fałszywego identyfikatora, który będzie pasował do pozycji w nim, to jest właśnie podzapytanie X jest przeznaczony.

Dwa podzapytania to JOIN ed przez n-ty znak mapy bitowej:jeśli znak wynosi 1, dodatek znajduje się w pakiecie, LEFT połączone, aby nie zgubić produktu bez dodatków.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Uzyskaj drugą najwyższą wartość w tabeli MySQL

  2. Jaki jest najlepszy sposób wstawiania i aktualizowania tabeli jednowierszowej w MySQL?

  3. Wskazówki dotyczące zapewniania wydajności bazy danych MySQL — część pierwsza

  4. 15 podstawowych pytań do rozmowy kwalifikacyjnej na temat MySQL dla administratorów baz danych

  5. Informacje o bazie danych information_schema w MySQL