Mysql 如果没有结果,另一个WHERE子句

Mysql 如果没有结果,另一个WHERE子句,mysql,Mysql,在mysql中,在一个查询中实现这一点的最佳方法是什么 SELECT * FROM products WHERE language = 1 如果没有结果 SELECT * FROM products WHERE language = 2 AND country = 1 SELECT * FROM products WHERE language = 2 AND country = 2 如果没有结果 SELECT * FROM products WHERE language = 2 AND c

在mysql中,在一个查询中实现这一点的最佳方法是什么

SELECT * FROM products WHERE language = 1
如果没有结果

SELECT * FROM products WHERE language = 2 AND country = 1
SELECT * FROM products WHERE language = 2 AND country = 2
如果没有结果

SELECT * FROM products WHERE language = 2 AND country = 1
SELECT * FROM products WHERE language = 2 AND country = 2

MySQL缺少允许一次完成的功能
示例:
densite\u-RANK
窗口函数,或

因此,在不使用临时表或IF语句(无论如何都需要MySQL中的存储过程)的情况下,在客户机上将其过滤到最低优先级值。也就是说,在值更改之前使用行

SELECT *, 1 AS priority FROM products WHERE language = 1
UNION ALL
SELECT *, 2 AS priority FROM products WHERE language = 2 AND country = 1
UNION ALL
SELECT *, 3 AS priority FROM products WHERE language = 2 AND country = 2
ORDER BY priority;

这确实消除了到MySQL服务器的往返,即使这并不理想。它还避免了重新评估EXISTS子句中以前的选择

我对其进行了编辑,使其能够工作,但它不再优雅


原来的(没有最后一个也不存在)有一个缺陷

事实证明这并不像我想象的那么聪明。见下面的评论。如果第一个和第三个查询返回数据,则会失败。如果您只有一个工会,但没有两个或更多工会,那么它确实有效


在mysql中非常简单:

select SQL_CALC_FOUND_ROWS * from products where language = 1
union
SELECT * FROM products WHERE language = 2 AND country = 1 and found_rows()=0
union
SELECT * FROM products WHERE language = 2 AND country = 2 and found_rows()=0 
AND not exists(select * from products where language = 1)
请参见此处对已找到的行()和SQL计算已找到的行的讨论:

您可以使用以下内容:(编辑为使用EXISTS和LIMIT,基于注释)

使用嵌套查询和count(*)检查以前的查询是否为空。

尝试:

select p.* 
from (select min(language) minlang, min(country) minctry 
      from products where language = 1 or
                          (language = 2 and country in (1,2)) ) c
join products p 
on p.language = c.minlang and (c.minlang=1 or p.country=c.minctry)

似乎没有好的方法,如果可能的话,最好将其放入一个过程中,要么填充临时表,要么将行集对象返回给客户端

但是,如果没有任何可能,您似乎已经限制了二级和三级查询:

SELECT * FROM products WHERE language = 1

UNION ALL

SELECT * FROM products WHERE language = 2 AND country = 1 
   AND NOT EXISTS (SELECT * FROM products WHERE language = 1)

UNION ALL

SELECT * FROM products WHERE language = 2 AND country = 2
   AND NOT EXISTS (SELECT * FROM products WHERE language = 1 OR (language = 2 AND country = 1 ))
但这肯定是丑陋和缓慢的


虽然

哪些列是*,但使用IS NULL的左连接可能比不存在好。不幸的是,这不是MySQL中的一个查询:您希望从itI中得到什么?我认为您可以通过OrderClearification获得所需的“逻辑”结果,由于有一些答案建议将WHERE子句分组为OR:这不是OP想要的,他们只希望得到
language=1
的结果,或者仅来自
language=2和country=1的结果
,或者仅来自
language=2和country=2的结果
。您似乎必须使用存储过程来填充临时表或将“rowset”对象传递给客户端。你能依赖UNION语句中找到的行吗?@gbn如果你不在任何地方使用LIMIT并检查0,你可以。嗯..我认为它实际上是可以挽救的。。将其他两条语句封装在select so中如何,那么它实际上是:1语句-Union-1语句,包含两条嵌套语句。@嵌套它们的meewoK不起作用,您不能在子查询中放入另一个SQL\u CALC\u FOUND\u行。使用not exists可能比检查0计数更好。@ShawnBalestracci将删除这些子查询(计数或存在-无所谓)在每一行上重新执行?也许左连接+检查null会是更好的方法?我有一种强烈的感觉,优化器只计算一次最佳分支并预先计算它们。这就是为什么SQL引擎会这样做:)@Shawn Balestracci谢谢,我将检查“不存在”并相应地更新我的答案。如果您将优先级作为案例条件进行评估,您可以在一次选择中执行此操作-类似于
案例语言1时1时2时2时语言+国家/地区其他4结束