【问题标题】:How do I get an inclusive result set without using PHP?如何在不使用 PHP 的情况下获得包容性结果集?
【发布时间】:2011-11-07 17:24:39
【问题描述】:

好的,所以我有一个名为exp_category_posts 的表,它负责将entry_id 与其关联的cat_ids 之间的关系存储为表中的行(entry_id 的一列, cat_id 的一列)

对于我正在编写的搜索插件,用户可以按类别搜索,我想返回所有匹配的条目。

如果我尝试SELECT entry_id FROM exp_category_posts WHERE cat_id = 1 AND cat_id = 2,我希望得到一组分配给两只猫的条目,但我每次都得到一个空的结果集。使用OR 并没有给出我想要的结果集。

我发现获得我想要的结果的唯一方法是将其分解为多个步骤:

第 1 步:查询每个 cat_id。
第 2 步:将结果集保存为数组。
第 3 步:使用几个 in_array() 调用来过滤掉不在所有结果集中的条目。

虽然这种方法有效,但效率很低。有什么方法可以让我通过单个查询而不是这样来获得我想要的结果?

【问题讨论】:

  • 假设 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,这不是我想要的。

标签: mysql expressionengine


【解决方案1】:
SELECT
    entry_id
FROM
    exp_category_posts
WHERE
    cat_id = 1 OR
    cat_id = 2
GROUP BY
    entry_id
HAVING
    COUNT(*) = 2

【讨论】:

  • 优雅的解决方案。当 cat_id 超过 2 个时,工作速度比 JOIN 稍快。
【解决方案2】:

你想要的是两个集合之间的交集:

  • 具有cat_id = 1entry_id
  • 具有cat_id = 2entry_id

你可以像这样使用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

【讨论】:

  • 这种方法不太容易推广到超过 2 个集合的交集。如果我想找到k不同集合的交集,那么使用你的方法我需要加入k - 1次,比较尴尬。
猜你喜欢
  • 2017-06-08
  • 2018-06-07
  • 1970-01-01
  • 2023-03-25
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 2013-11-20
相关资源
最近更新 更多