Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Hoán vị MySQL

Mọi phần bổ sung có thể nằm trong gói hoặc không, làm cho nó trở thành thuộc tính nhị phân.
Một cách để hình dung sự kết hợp là tạo một từ có một bit cho mỗi phần bổ sung, 1 nghĩa là phần bổ sung nằm trong danh sách, 0 nghĩa là không phải.
Ví dụ:Bench + undershelf + overshelf là 110 (hoặc 011 nếu chuỗi nhị phân được đọc theo thứ tự ngược lại)

Việc tạo mọi kết hợp của n bit sẽ cung cấp mọi kết hợp của n phần phụ, nó cũng sẽ cung cấp mọi số từ 0 thành 2^n - 1 .

Chúng tôi có thể làm việc trở lại từ đây:
1. tạo danh sách số từ 0 thành 2^n - 1;
2. chuyển đổi số sang hệ nhị phân, để liệt kê sự kết hợp của các phần phụ
3. khớp từng bit với một
4 thừa. nối tên của các tính năng bổ sung trong mô tả gói.

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

truy vấn này sẽ hoạt động tối đa sáu phần bổ sung, sau đó nó sẽ cần một bảng chữ số khác (một chữ số cứ sau ba phần bổ sung).

Cách hoạt động

Truy vấn con E đếm số phần bổ sung, điều này được sử dụng trong C để giới hạn các phần tử được tạo bởi các bảng chữ số ut (đơn vị và hàng chục) thành 2 ^ dim.

Số được chuyển đổi thành nhị phân bởi BIN(u.N + t.N * 10) , sau đó được đệm bên trái bằng '0' vào số phần tử, tạo ra một bitmap kết hợp.

Để sử dụng bitmap được tạo, mỗi phần bổ sung cần một id giả sẽ khớp với một vị trí trong đó, đó là truy vấn con X có nghĩa là cho.

Hai truy vấn con là JOIN ed bởi char thứ n của bitmap:nếu char là 1 thì phần bổ sung sẽ nằm trong gói, LEFT tham gia để không làm mất sản phẩm mà không có tính năng bổ sung.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm kiếm tên đầy đủ hoặc họ hoặc tên trong cơ sở dữ liệu MySQL với họ và tên trong các cột riêng biệt

  2. Ràng buộc duy nhất cho phép các giá trị trống trong MySQL

  3. SQL LIKE% bên trong mảng

  4. Chọn tất cả các bản ghi không đáp ứng các điều kiện nhất định trong một bảng đã tham gia

  5. Tìm kiếm tính khả dụng với MySQL (và PHP)?