سؤال

أعلم أن 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 )

أتمنى أن يساعدك هذا

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top