2011-11-07 62 views
0

好了,我有這個表稱爲exp_category_posts這是負責存儲的entry_id之間的關係和所有它相關的cat_id S,如表中的行(爲entry_id一列,爲cat_id一列)如何在不使用PHP的情況下獲得包含結果集?

對於我正在編寫的搜索插件,用戶可以按類別搜索,並且我想返回所有匹配的條目。

如果我嘗試SELECT entry_id FROM exp_category_posts WHERE cat_id = 1 AND cat_id = 2我希望獲得一組分配給兩個貓的條目,但是我每次都會得到一個空的結果集。使用OR不會提供我想要的結果集。

我發現得到我想要的結果的唯一方法是將其打入步驟:

第1步:做每個CAT_ID查詢。
第2步:將結果集保存爲數組。
步驟3:使用幾個in_array()調用過濾掉不在所有結果集中的條目。

儘管此方法有效,但效率相當低。有什麼辦法可以通過單個查詢來獲得我想要的結果,而不是以這種方式進行?

+0

假設'WHERE cat_id = 1'返回1,2,3,4,5,'WHERE cat_id = 2'返回3,4,5,6,7。我想得到的結果是3,4,5。使用OR而不是AND會返回1,2,3,4,5,6,7,這不是我想要的。 – Jazzerus

回答

1
SELECT 
    entry_id 
FROM 
    exp_category_posts 
WHERE 
    cat_id = 1 OR 
    cat_id = 2 
GROUP BY 
    entry_id 
HAVING 
    COUNT(*) = 2 
+0

優雅的解決方案。當超過2個cat_ids時,其工作速度比JOIN稍快。 – Jazzerus

1

你想要的是兩個集合之間的交集:

  • entry_id的有cat_id = 1
  • entry_id「有cat_id = 2

是你能得到與INNER JOIN像這樣:

SELECT c1.entry_id 
FROM 
    exp_category_posts AS c1 
    INNER JOIN (
     SELECT entry_id 
     FROM exp_category_posts 
     WHERE cat_id = 2 
    ) AS c2 
     ON c1.entry_id = c2.entry_id 
WHERE c1.cat_id = 1 
+0

這種方法不是很容易推廣到超過2組的交點。如果我想找到'k'不同組的交集,那麼使用你的方法我需要加入'k-1'次,這是相當尷尬的。 – Hammerite

相關問題