Php 在一个mysql操作中使用三个WHERE语句作为更好的过滤器是可能的吗?

Php 在一个mysql操作中使用三个WHERE语句作为更好的过滤器是可能的吗?,php,mysql,database,where,Php,Mysql,Database,Where,我正在尝试比较两个表,并研究这个操作的结果 SELECT * FROM table1 WHERE table1.czlowiek_id NOT IN ( SELECT table2.czlowiek_id FROM table2 WHERE table1.czlowiek_id=table2.czlowiek_id ) OR table1.czlowiek_id IN ( SELECT table2.czlowiek_id FROM table2

我正在尝试比较两个表,并研究这个操作的结果

SELECT * FROM table1
WHERE table1.czlowiek_id NOT IN (
    SELECT table2.czlowiek_id
    FROM table2
    WHERE table1.czlowiek_id=table2.czlowiek_id
)  
OR table1.czlowiek_id IN (
    SELECT table2.czlowiek_id
    FROM table2
    WHERE table1.czlowiek_id=table2.czlowiek_id
    AND table2.szkolenie_id IN ('$selected_one')
    AND table1.instruktor IN ('$selected_two')
) 

是否有一些选项可以处理此查询的结果并添加另一个WHERE语句?

您可以使用
左连接解决此问题。这将允许您从表1中提取表2中不存在的所有结果,并从表1中提取表2中的结果并匹配请求的过滤器

SELECT
    *
FROM
    table1
    LEFT JOIN table2 ON table1.czlowiek_id=table2.czlowiek_id
WHERE
    table2.czlowiek_id IS NULL
    OR (
        table2.szkolenie_id IN ('$selected_one')
        AND table1.instruktor IN ('$selected_two')
    )

您可以使用
左连接解决此问题。这将允许您从表1中提取表2中不存在的所有结果,并从表1中提取表2中的结果并匹配请求的过滤器

SELECT
    *
FROM
    table1
    LEFT JOIN table2 ON table1.czlowiek_id=table2.czlowiek_id
WHERE
    table2.czlowiek_id IS NULL
    OR (
        table2.szkolenie_id IN ('$selected_one')
        AND table1.instruktor IN ('$selected_two')
    )

有另一种表达方式。我们的想法是在czlowiek_id级别汇总表2中的信息,保留关于szkolenie_id的信息,因为可能需要它

这会将查询更改为一个group,后跟一个传统的join和一个相当普通的where子句:

select table1.*
from table1 left outer join
     (select czlowiek_id,
             (case when table2.szkolenie_id IN ('$selected_one') then 1
                   else 0
              end) as flag
      from table2
      group by czlowiek_id
     ) t2
     ON table1.czlowiek_id = t2.czlowiek_id
WHERE t2.czlowiek_id IS NULL OR
      (t2.flag = 1  AND table1.instruktor IN ('$selected_two') ) 

有另一种表达方式。我们的想法是在czlowiek_id级别汇总表2中的信息,保留关于szkolenie_id的信息,因为可能需要它

这会将查询更改为一个group,后跟一个传统的join和一个相当普通的where子句:

select table1.*
from table1 left outer join
     (select czlowiek_id,
             (case when table2.szkolenie_id IN ('$selected_one') then 1
                   else 0
              end) as flag
      from table2
      group by czlowiek_id
     ) t2
     ON table1.czlowiek_id = t2.czlowiek_id
WHERE t2.czlowiek_id IS NULL OR
      (t2.flag = 1  AND table1.instruktor IN ('$selected_two') ) 

您可以将语句包装在一组括号中,并为其分配一个别名(位于结束父级之后),并将其用作表。(我们称之为内联视图。)

您可以在WHERE子句中引用内联视图返回的任何列。(这种方法对于返回较小(大小合理)结果集的内联视图来说效果相对较好。但是对于较大的结果集,要“具体化”需要做很多繁重的工作。)这是一种有用的模式,但也可能滥用这种模式,编写的语句比不使用内联视图的等效语句执行得更糟糕

SELECT q.*
  FROM (
         SELECT * FROM table1 ... /*your whole query here*/
       ) q
 WHERE ... 
但我不确定你问的是这个问题

你能给WHERE子句添加另一个谓词吗

当然可以…只需添加另一个
关键字,并添加条件测试。只需注意和和或之间的优先级。最好使用括号来指定期望的顺序,这是一个不同的做法

( a OR b ) AND c  
a OR ( b AND c)
但我也不确定这是否回答了你的问题

相关子查询可以使用
存在
不存在
,而不是
中的
不存在

我相信这会带来同样的结果:

SELECT *
  FROM table1
 WHERE NOT EXISTS 
       ( SELECT 1 FROM table2
          WHERE table2.czlowiek_id=table1.czlowiek_id
       )
    OR EXISTS 
       ( SELECT 1 FROM table2
          WHERE table2.czlowiek_id=table1.czlowiek_id
            AND table2.szkolenie_id IN ('$selected_one')
            AND table1.instruktor IN ('$selected_two')
       )

您可以将语句包装在一组括号中,并为其指定一个别名(在结束父级之后),并将其用作表(我们称之为内联视图)

您可以在WHERE子句中引用内联视图返回的任何列。(这种方法可以与返回较小(大小合理)结果集的内联视图相对较好地工作。但是对于较大的结果集,要“物化”有很多繁重的工作要做。)这是一种有用的模式,但也可能滥用这种模式,编写的语句比不使用内联视图的等效语句执行得更糟糕

SELECT q.*
  FROM (
         SELECT * FROM table1 ... /*your whole query here*/
       ) q
 WHERE ... 
但我不确定你问的是这个问题

你能给WHERE子句添加另一个谓词吗

当然可以…只需添加另一个
关键字,并添加条件测试。只需注意和和或之间的优先级。最好使用括号来指定期望的顺序,这是一个不同的做法

( a OR b ) AND c  
a OR ( b AND c)
但我也不确定这是否回答了你的问题

相关子查询可以使用
存在
不存在
,而不是
中的
不存在

我相信这会带来同样的结果:

SELECT *
  FROM table1
 WHERE NOT EXISTS 
       ( SELECT 1 FROM table2
          WHERE table2.czlowiek_id=table1.czlowiek_id
       )
    OR EXISTS 
       ( SELECT 1 FROM table2
          WHERE table2.czlowiek_id=table1.czlowiek_id
            AND table2.szkolenie_id IN ('$selected_one')
            AND table1.instruktor IN ('$selected_two')
       )

使用
有什么问题?siem ziom,您可以执行另一个子选择,如SELECT*FROM(SELECT…)WHERE…“以处理此查询的结果并添加另一个WHERE”。你到底想做什么?你可以把它放在一个临时表中,然后用它作为你的表来处理一系列其他你想用它做的事情。我确实想把这个结果放在虚拟表或临时表中,但我不确定怎么做。@qxxx->我应该选择什么别名?使用
和有什么问题
?siem ziom,您可以执行另一个子选择,如选择*自(选择…)何处…“以处理此查询的结果并添加另一个何处”。您到底想做什么?您可以将其放入临时表中,然后将其作为您的表来处理一系列其他您想用它做的事情。我确实想将此结果放入虚拟表或临时表中,但我不确定如何操作。@qxxx->我应该选择什么别名?然后我可以询问另一个WHERE语句?从表1中选择*左键连接表1上的表2。czlowiek_id=table2.czlowiek_id,其中table2.czlowiek_id为NULL,或者('$selected_one')中的table2.szkolenie_id和('$selected_two')中的table1.instruktor在('$selected_two')中的别名?.szkolenie_id2在('$selected_three)中的否,在MySQL中(也不是我知道的任何其他数据库模式),您不能以这种方式组合
WHERE
子句(重复使用关键字
WHERE
)。如果需要添加其他筛选器/条件,请使用
添加它们,例如:
其中table2.czlowiek_id为NULL,table2.szkolenie_id2为空(“$selected\u three”)
\结果与上面我的查询中的结果相同,然后我可以询问另一个WHERE语句?从表1左选择*连接表1上的表2。czlowiek\u id=表2.czlowiek\u id WHERE