Mysql 使用';如果';在';选择';在';其中';SQL查询中的子句
我们有以下疑问:Mysql 使用';如果';在';选择';在';其中';SQL查询中的子句,mysql,sql,Mysql,Sql,我们有以下疑问: SELECT foo_id, IF (( SELECT COUNT(foo_mapping_id) FROM foo_bar_mappings, bar WHERE foo_mapping_foo_id = foo_id AND foo_mapping_bar_id = bar_id ) >
SELECT
foo_id,
IF (( SELECT
COUNT(foo_mapping_id)
FROM
foo_bar_mappings,
bar
WHERE
foo_mapping_foo_id = foo_id
AND foo_mapping_bar_id = bar_id ) > 0,
foo_status,
'inactive') AS foo_status
FROM
foo
WHERE
foo_status = 'inactive'
当我们运行它时,我们会得到一个空结果,因为foo_status
不等于inactive
(而有些行满足IF
)foo_status
是存在于foo
表中的一列,但我们希望“覆盖”它
我们如何更改此查询,以便使用我们的
WHERE
子句中的IF
返回的foo\u status
?显然,此查询已被简化,以使问题更容易询问和理解。您不能在where
子句中使用列别名。MySQL扩展了HAVING子句,因此可以使用它:
having foo_status = 'inactive'
注:
我将把查询写为:
SELECT f.foo_id,
(CASE WHEN (EXISTS (SELECT 1
FROM foo_bar_mappings fb JOIN
bar b
ON fb.foo_mapping_bar_id = b.bar_id
WHERE fb.foo_mapping_foo_id = f.foo_id
)
THEN foo_status
ELSE 'inactive'
END) AS new_foo_status
FROM foo f
HAVING new_foo_status = 'inactive';
注:
- 在这种情况下,
比EXISTS
更有效COUNT(*)
- 我更喜欢
而不是CASE
,因为前者是ANSI标准IF()
- 我不喜欢使用与实际列同名的列别名。使用别名时,这可能会造成混淆
HAVING
子句中使用列别名,但我发现您在发布的查询中没有分组依据。在这种情况下,可以在外部查询中使用别名列,如
SELECT * FROM (
SELECT
foo_id,
IF (( SELECT
COUNT(foo_mapping_id)
FROM
foo_bar_mappings,
bar
WHERE
foo_mapping_foo_id = foo_id
AND foo_mapping_bar_id = bar_id ) > 0,
foo_status,
'inactive') AS foo_status
FROM
foo ) xxx
WHERE
foo_status = 'inactive'
但是有
没有任何分组依据
。这有意义吗?@Rahul。由于这个扩展,它在MySQL中不起作用。我认为这个扩展的存在是因为MySQL实现了子查询(其他数据库不一定这样做),所以这是一种不用子查询进行过滤的方法。谢谢