Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:仅当第一个查询没有';返回结果_Mysql_Sql_Union - Fatal编程技术网

MySQL:仅当第一个查询没有';返回结果

MySQL:仅当第一个查询没有';返回结果,mysql,sql,union,Mysql,Sql,Union,我需要这个查询: 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是否足够聪明,能够理解考虑到限制1,当union的第一个查询返回

我需要这个查询:

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是否足够聪明,能够理解考虑到限制1,当union的第一个查询返回某个时,他不需要执行第二个查询

要只进行一个查询,我可以执行以下操作:

SELECT * FROM best WHERE best = 'value' AND lang IN ('x','custom') LIMIT 1
但是,对于这个查询,我不能说使用
lang='x'

对记录给予更高的优先级,您可以使用:


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

您可以将另一个
选择
包装在您的
联合体周围,您可以
按lang DESC下单
限制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;

正确答案是扬·汉契奇的答案(+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

我想X只是一个占位符,它可以是任何东西,所以您的查询不会总是有效的。他试图实现联合体中的第二个查询不会运行,而您的查询无法实现这一点。在SQL这样的声明性语言中,运行或不运行查询是不可能的。对于特定的示例,我的答案解决了优先级问题。但是,我承认您的解决方案更优雅(因此+1)。第一个查询中的限制1是第二个联合查询的一部分,因此都将执行。否:)您缺少(&)关于该限制的查询来限制整个结果。现在它只是限制了第二个查询。@yes123,True。但对此有异议吗?我说这不是解决办法。只是为了补充信息。(如果干扰,我可以删除答案)我认为你的答案更优雅地解决了问题。。谢谢你的回答,这对我帮助很大;)+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