2010-04-05 70 views
2

我知道mySQL 5.x不支持INTERSECT,但這似乎是我需要的。mySQL專家 - 需要與'intersect'的幫助

表A:產品(P_ID)

表B:Prod_cats(CAT_ID) - 類別信息(名稱,說明,等)

表C:prod_2cats(P_ID,CAT_ID) - 多對多

prod_2cats包含已分配給產品(A)的許多(1個或多個)類別。

執行查詢/過濾器查找(用戶交互式),並且需要能夠在多個類別中選擇符合所有條件的產品。

例如: - 分配給Y類 50個產品 - - 但只有10個產品(交叉)被分配給兩個貓X和貓Ÿ

這個SQL適用於一個類別分配到X類 80產品:

SELECT * FROM產品WHERE p_show = 'Y' 和P_ID IN(SELECT的p_id FROM prods_2cats AS PC WHERE PC.cat_id = 「$ CAT_ID。」

< - $ CAT_ID被消毒VAR從查詢傳遞表格

我似乎無法找到的手段說「給我的貓的交叉和貓B」,並取回該子集(10條記錄,從我的例子)

幫助!

回答

1

從集理論應用交集的定義。因此,如果X交叉Ÿ給人設置Z,然後沿Z每個x它認爲,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) 
+0

謝謝 - 這是我一起去的,而且很有效。 (ANDS的鏈接) – MTCreations 2010-04-07 13:32:38

2

嗯,我不知道它是做的最好的方式,但它可以被添加到您的已經存在的查詢很容易:

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) 
+0

謝謝 - 這是我一起工作,它的工作。 (ANDS的鏈接) – MTCreations 2010-04-07 13:35:11

1
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) 

希望這會有所幫助

+0

感謝您的回答 - 我首選其他(鏈接的ANDS),因爲爲簡單起見,我還遺漏了其他查詢部分 - 並且嵌套的子查詢將更難以動態工作(如反對一系列AND鏈)。 – MTCreations 2010-04-07 13:34:23

+0

@MITCreations:de nada =)嵌套更短,我沒有看到任何動態構建表達式的原因比用AND添加更多條件更難,恕我直言 – vittore 2010-04-07 14:04:00