表达式引擎SQL AND OR查询?

时间:2014-04-06 21:38:36

标签: mysql sql expressionengine

我需要做的是同一查询中的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

1 个答案:

答案 0 :(得分: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)
  )

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