MySQL:仅在第一个查询不返回结果时执行第二个查询

3
我需要这个查询:
SELECT * FROM best WHERE best = 'value' AND lang = 'x' 
   UNION 
SELECT * FROM best WHERE best = 'value' AND lang = 'custom' 
LIMIT 1

基本上我只需要一个记录,其中 best = 'value' 并且 lang = 'x',如果找不到这个记录,则需要执行第二个查询,其中 lang ='custom'
MySQL 是否足够聪明,能否理解在联合的第一个查询返回结果时,考虑到有 LIMIT 1,他不需要执行第二个查询
为了只有一个查询,我可以这样做:
SELECT * FROM best WHERE best = 'value' AND lang IN ('x','custom') LIMIT 1

但是使用这个查询,我无法说将优先权更多地给予 lang = 'x' 的记录。
3个回答

5

您可以使用ORDER BY FIELD()来排序:

SELECT
  *
FROM
  best
WHERE
  best = 'value'
  AND lang IN ( 'x', 'custom' )
ORDER BY FIELD ( lang, 'x', 'custom' )
LIMIT
  1

这将解决您的“优先级”问题 :)

你第一个查询中的 LIMIT 1 是第二个 UNION 查询的一部分,所以两个查询都会执行。 - Jan Hančič
不对 :) 你的查询语句中缺少 ( & ),以限制整个结果的 LIMIT。现在它只限制第二个查询。 - Jan Hančič

3
正确的答案是Jan Hančič的答案(+1)。
但是,一个更适用于未来更复杂的选择和几乎独立于数据库品牌的替代解决方案可能是:
SELECT * FROM (
  SELECT *, 1 as preference 
    FROM best WHERE best = 'value' AND lang = 'x' 
   UNION 
  SELECT *, 2 as preference 
    FROM best WHERE best = 'value' AND lang = 'custom' 
) T ORDER BY preference
LIMIT 1

@yes123,没错。但是有人对此提出了异议吗?我说过,这不是解决方案。只是为了补充信息。(如果有干扰的话,我可以删除回答) - dani herrera
1
我认为你的答案更优雅地解决了这个问题。谢谢你的回答,它帮了我很大的忙;)+1 - Fipsi

-1
你可以在你的 UNION 中再包装一个 SELECT,并使用 ORDER BY lang DESCLIMIT 1 进行排序。
SELECT * FROM (
  SELECT * FROM best WHERE best = 'value' AND lang = 'x' 
  UNION 
  SELECT * FROM best WHERE best = 'value' AND lang = 'custom' 
)
ORDER BY lang DESC LIMIT 1;

我猜想X只是一个占位符,它可以是任何东西,所以你的查询不一定会有效。他试图达到的目标是使UNION中的第二个查询不运行,而你的查询没有实现这一点。 - Jan Hančič
在像SQL这样的声明性语言中,无法进行运行或不运行查询的决定。对于特定的例子,我的答案解决了优先级问题。但是,我承认你的解决方案更加优雅(因此+1)。 - tobiasbayer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接