Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

SQL:Dapatkan Produk dari suatu kategori tetapi juga harus dalam kumpulan kategori lain

Jenis masalah ini disebut pembagian relasional .

Ada dua solusi umum:

  1. Solusi pertama menyatukan kategori yang cocok dan membandingkannya dengan string tetap:

    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. Solusi kedua melakukan JOIN untuk setiap nilai yang diperlukan:

    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) 
    

Saya membahas solusi ini dalam presentasi saya Pola Kueri SQL, Dioptimalkan . Saya menemukan dalam pengujian saya bahwa solusi bergabung jauh lebih baik untuk kinerja.

Saran @ Tom benar, inilah yang akan terlihat seperti kueri lengkap:

    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 yang disarankan @Tom tidak perlu, karena tabel p2c Anda harus memiliki batasan UNIK (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. Bagaimana cara meningkatkan SQL menggunakan pemicu?

  2. Strategi penamaan hibernasi mengubah nama tabel

  3. Menambahkan kunci asing ke tabel yang ada memberikan kesalahan 1050 tabel sudah ada

  4. Memesan berdasarkan nilai bidang tertentu terlebih dahulu

  5. Bagaimana menemukan nomor aktif dari koneksi database terbuka di H2/MySQL