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