Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL пермутация

Всяка екстра може да бъде в пакета или не, което го прави двоично свойство.
Начинът да визуализирате комбинацията е да създадете дума с бит за всяка екстра, 1 означава, че екстрата е в списъка, 0 означава, че не е.
Например Bench + undershelf + overshelf е 110 (или 011, ако двоичният низ се чете в обратния ред)

Генерирането на всяка комбинация от n бит ще даде всяка комбинация от n екстри, също така ще даде всяко число от 0 до 2^n - 1 .

Можем да работим обратно от тук:
1. генерира списък с номера от 0 до 2^n - 1;
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

тази заявка ще работи с до шест екстри, след което ще се нуждае от друга таблица с цифри (една цифра на всеки три екстри).

Как работи

Подзаявката E пребройте броя на екстрите, това се използва в C за ограничаване на елементите, генерирани от цифровите таблици u и t (единица и десетки) до 2^dim.

Числото се преобразува в двоично чрез BIN(u.N + t.N * 10) , след това допълнено вляво с '0' до броя на елементите, генерирайки комбинация от растерно изображение.

За да използвате генерираното растерно изображение, всяка екстра се нуждае от фалшив идентификатор, който да съответства на позиция в него, това е, което подзаявката X е предназначено за.

Двете подзаявки са JOIN ed от n-ия знак на растерното изображение:ако знакът е 1, допълнителният е в пакета, LEFT съединени, за да не загубите продукта без екстри.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL вмъкнете там, където не съществува / ако не съществува

  2. Незаконен микс от съпоставяния (utf8mb4_unicode_ci,IMPLICIT) и (utf8mb4_general_ci,IMPLICIT) за операция '='

  3. Скрити характеристики на MySQL

  4. Как да използвам буквено-цифрови полета с клауза BETWEEN в Mysql?

  5. Посочване на парола в MySQL низ за връзка