2011-11-07 30 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

相关问题