【问题标题】:expression engine SQL AND OR query?表达式引擎 SQL AND OR 查询?
【发布时间】:2014-04-06 21:38:36
【问题描述】:

我需要做的是在同一个查询中同时使用 AND 和 OR,我知道这是不可能的,所以寻找替代方案,请帮助!

我在 ee 中有两个类别组,一个是确定哪些用户能够看到该文件,另一个将文件过滤到不同的组中。

我需要做的是选择类别 19 中的每个文件(这是为了确定用户组),然后我需要检查它是否在过滤器类别之一中。不幸的是,每次将新类别分配给文件时,都会在表中创建一个新行,例如下面的非工作 sql。

SELECT c.cat_id, 
f.* 
FROM exp_file_categories c 
inner join exp_files f ON (c.file_id = f.file_id) 
where c.cat_id in (20, 21) 
AND c.cat_id = 19 
group by c.file_id

【问题讨论】:

  • 不确定您在寻找什么,您可以添加一些示例数据和预期输出吗?
  • 您无法选择位置(id=20 或 id=21)和 id=19,这永远不会是真的。 id 不能是两个东西
  • 这是一个包含所有类别 ID link 的表,一旦完成,我将把它加入另一个表并按file_id分组。这有什么场景吗?

标签: mysql sql expressionengine


【解决方案1】:

不知道你的表我假设你想做以下事情

首先:你要获取19类的file_id列表:

SELECT
    file_id
FROM
    exp_file_categories
WHERE
    cat_id = 19

现在你想看看,这些文件中的哪些与 cat_ids 20 或 21 有关联:
您可以使用子查询(用于过滤)来做到这一点

SELECT DISTINCT
   f.file_id
   -- , other columns from exp_files
FROM
   exp_files f
INNER JOIN
   exp_file_categories c
ON
   f.file_id = c.file_id
WHERE
   c.file_id IN (20, 21)
AND
   f.file_id IN (
       SELECT
           c1.file_id
       FROM
           exp_file_categories c1
       WHERE
           c1.cat_id = 19
  )

您还可以将外部查询连接到子查询。你必须给子查询一个别名。

否则,您可以在 WHERE 子句中使用两个子查询:

SELECT
    <field_list>
FROM
    exp_files
WHERE
    -- file_id is in the list of files associated with category 19
    f.file_id IN (
       SELECT
           c1.file_id
       FROM
           exp_file_categories c1
       WHERE
           c1.cat_id = 19
  )
AND
   -- file_id is in the list of files associated with category 20 and 21
    f.file_id IN (
       SELECT
           c2.file_id
       FROM
           exp_file_categories c2
       WHERE
           c1.cat_id IN (20, 21)
  )

您应该检查这些查询的执行计划

【讨论】:

  • 这是完美的场景,但奇怪的是它没有返回我所期待的。它返回 165 个结果,但只有 108 个文件分配给类别 19,因此这是不正确的。也许它没有按正确的顺序运行??
  • 对不起。我忘记了一个文件可能属于这两个类别。如果您的结果中不需要 exp_file_categories 表中的任何列,您只需将关键字 DISTINCT 添加到此查询:SELECT DISTINCT ...
  • 太棒了,非常感谢!不敢相信我花了多长时间看这个。
猜你喜欢
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多