【问题标题】:MySQL SELECT only if doesn't matchMySQL SELECT 仅当不匹配时
【发布时间】:2011-07-17 12:45:06
【问题描述】:

我正在尝试根据名称字段的值从表中进行选择。

如果记录不是基于第一个条件,我只想匹配某些条件,即。

如果以下匹配:

WHERE name='version'

如果是,则返回该单行,如果不是,也请查找这些:

WHERE name='v' OR name='e' OR name='r' 等等……

这可以在单个查询中实现吗?

非常感谢!

【问题讨论】:

  • 我想你可能想使用 LIKE。但是你的问题不是很清楚。如果字段等于其中任何一个字母,您想匹配吗?或者如果它包含那些字母?
  • 您最终将使用 LIKE 或 REGEXP,具体取决于您的用例到底是什么...正如@Cfreak 上面所说,我们需要澄清您到底尝试了什么实现...
  • @Romain,不,不是真的,LIKE 和 REGEXP 都看不到单行;因此,他们无法帮助实现确定是否选择另一个结果集的逻辑。
  • @Unreason:你说的完全正确......对这个问题的第三次阅读让我对这一点有了不同(更好)的理解......

标签: mysql select where


【解决方案1】:
SELECT ...
FROM ..
WHERE name = 'version'
UNION ALL
SELECT ...
FROM ...
WHERE NOT EXISTS (
      SELECT ...
      FROM ..
      WHERE name = 'version'
      ) AND name IN ('v', 'e', 'r', ...) 

编辑:
不确定如何测试 mysql 是否会缓存第一个查询的结果,但假设您在新会话中运行查询:

SELECT @cached:=1, ...
FROM ..
WHERE name = 'version'
UNION ALL
SELECT 2, ...
FROM ...
WHERE @cached IS NULL AND name IN ('v', 'e', 'r', ...) 

应该工作

如果在同一个会话中你想用

清除@cached
SELECT @cached:=1, ...
FROM .., (SELECT @cached:=0) x
WHERE name = 'version'
UNION ALL
SELECT 2, ...
FROM ...
WHERE @cached = 0 AND name IN ('v', 'e', 'r', ...) 

【讨论】:

  • 谢谢,那绝对有效是实现我所追求的最有效的方法?
  • @user369190,服务器变量可能有一些技巧以避免运行两次查询,我会测试它......也不确定,但mysql可能会缓存第一次运行的结果询问。 @Andry M,阅读 OP 问题 - 如果没有名称等于 'version' 的行,他希望行带有 'v'、'e'、'r'
【解决方案2】:
select ...
from ..
where (name = 'version') or (name in ('v', 'e', 'r', ...))

不过,由于您是在同一领域进行比较,因此上述版本与

...
where (name in ('version', 'v', 'e', 'r', ...))

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 2016-08-01
    • 2012-12-15
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 2018-08-12
    • 1970-01-01
    相关资源
    最近更新 更多