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

SQL:Lấy Sản phẩm từ một danh mục nhưng cũng phải nằm trong một nhóm danh mục khác

Loại vấn đề này được gọi là phân chia quan hệ .

Có hai giải pháp phổ biến:

  1. Giải pháp đầu tiên xâu chuỗi các danh mục phù hợp lại với nhau và so sánh với một chuỗi cố định:

    SELECT p2c.product_id
    FROM oc_product_to_category p2c
    GROUP BY p2c.product_id
    HAVING GROUP_CONCAT(p2c.category_id SEPARATOR ',' ORDER BY p2c.category_id) = '1,2'
    
  2. Giải pháp thứ hai thực hiện JOIN cho mỗi giá trị bắt buộc:

    SELECT p.product_id 
    FROM oc_product p 
    INNER JOIN oc_product_to_category p2c1 
      ON (p.product_id = p2c1.product_id AND p2c1.category_id = 1) 
    INNER JOIN oc_product_to_category p2c2 
      ON (p.product_id = p2c2.product_id AND p2c2.category_id = 2) 
    

Tôi đề cập đến các giải pháp này trong bản trình bày của mình Mẫu truy vấn SQL, được tối ưu hóa . Tôi nhận thấy trong các thử nghiệm của mình rằng giải pháp kết hợp tốt hơn nhiều cho hiệu suất.

Đề xuất của @ Tom là đúng, đây là những gì sẽ trông như thế trong một truy vấn hoàn chỉnh:

    SELECT p.product_id, GROUP_CONCAT(p2c3.category_id SEPARATOR ',') AS categories
    FROM oc_product p 
    INNER JOIN oc_product_to_category p2c1 
      ON (p.product_id = p2c1.product_id AND p2c1.category_id = 1) 
    INNER JOIN oc_product_to_category p2c2 
      ON (p.product_id = p2c2.product_id AND p2c2.category_id = 2) 
    INNER JOIN oc_product_to_category p2c3
      ON (p.product_id = p2c3.product_id)
    GROUP BY p.product_id;

DISTINCT mà @Tom gợi ý là không cần thiết, vì bảng p2c của bạn phải có ràng buộc DUY NHẤT đối với (product_id, category_id).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách giám sát cơ sở dữ liệu MySQL / MariaDB bằng Netdata trên CentOS 7

  2. MySQL CHECK ràng buộc thay thế

  3. định dạng ngày tháng trong node.JS

  4. Mô hình codeigniter với nhiều điều kiện cập nhật bằng cách sử dụng câu lệnh where thủ công

  5. PHP Chèn dữ liệu từ bảng này sang bảng khác