خبراء MySQL - يحتاجون إلى مساعدة في "المتقاطع"
سؤال
أعلم أن MySQL 5.x لا يدعم التقاطع ، لكن يبدو أن هذا ما أحتاجه.
الجدول أ: المنتجات (P_ID)
الجدول ب: prod_cats (cat_id) - معلومات الفئة (الاسم ، الوصف ، إلخ)
الجدول C: prod_2cats (p_id ، cat_id) - الكثير إلى الكثير
يحتفظ Prod_2Cats بالعديد من الفئات (1 أو أكثر) التي تم تعيينها للمنتجات (أ).
إجراء بحث عن استعلام/مرشح ، (تفاعلي المستخدم) ويجب أن يكون قادرًا على الاختيار عبر فئات متعددة ، المنتجات التي تلبي جميع المعايير.
على سبيل المثال: - 80 منتجًا تم تعيينه في الفئة X - 50 منتجًا تم تعيينه للفئة Y - ولكن يتم تعيين 10 منتجات فقط (تقاطع) لكل من Cat X و Cat Y
يعمل SQL هذا لفئة واحدة:
حدد * من المنتجات التي p_show = 'y' و p_id in (حدد p_id من prods_2cats
ككمبيوتر حيث pc.cat_id = ". $ cat_id."
<-$ CAT_ID يتم تمرير VAR من نموذج الاستعلام.
لا يمكنني العثور على الوسائل لأقول "أعطني تقاطع CAT A و CAT B" وأعود المجموعة الفرعية (10 سجلات ، من مثالي)
مساعدة!
المحلول
تطبيق تعريف التقاطع من نظرية المجموعة. لذلك إذا كان X intersect y يعطي مجموعة z ، فعندئذ لكل x في z ، فإنه يحمل أن x في x و x في Y.
شيء مثل
SELECT * FROM products WHERE p_show='Y' AND p_id IN
( SELECT p_id FROM prods_2cats AS PC WHERE PC.cat_id =X) AND p_id IN
( SELECT p_id FROM prods_2cats AS PC WHERE PC.cat_id =Y)
نصائح أخرى
حسنًا ، لست متأكدًا من أنها أفضل طريقة للقيام بذلك ، ولكن يمكن إضافتها إلى استعلامك الموجود بالفعل بسهولة:
SELECT *
FROM products
WHERE p_show='Y'
AND p_id IN (SELECT p_id
FROM prods_2cats AS PC
WHERE PC.cat_id = $cat1_id)
AND p_id IN (SELECT p_id
FROM prods_2cats AS PC2
WHERE PC2.cat_id = $cat2_id)
SELECT *
FROM products
WHERE p_show='Y'
AND p_id IN (SELECT p_id
FROM prods_2cats AS PC
WHERE PC.cat_id in ($cat1_id, $cat2_id ))
أو حتى أفضل
SELECT p.*
FROM products p INNER JOIN prods_2cats AS PC on p.p_id = PC.p_id
WHERE p_show='Y' and C.cat_id in ($cat1_id, $cat2_id )
أتمنى أن يساعدك هذا