mysql - MySQL IN 子句的特点

标签 mysql optimization

我刚刚使用 MySQL 的 IN 解决了​​一个有趣的问题,但我不知道这个“技巧”叫什么。

在我的设计中,我需要过滤掉不需要特定技能或满足技能名称和技能级别的行。这是解决方案:

SELECT * FROM table WHERE
    skillname = "" OR
    (skillname, skilllevel) IN (
        SELECT name, level FROM skills WHERE user="Mikhail"
    )

根据dev.mysql.com,我不知道expr IN (value,...) exprvalue 都可以是多列。

这叫什么,还有更多类似的快捷方式吗?
更重要的是 - 有没有办法将此查询转换为匹配 skilllevel 作为“大于或等于”?


解决方案根据@yokoloko(尽管他不会承认)

SELECT * FROM t1 WHERE
    skillname = "" OR
    skillname IN (
        SELECT name FROM skills WHERE user="Mikhail" AND level >= t1.skilllevel
    )

最佳答案

抱歉,IN 谓词总是比较相等 的值,而不是大于或等于。

我是这样写的:

SELECT table.* 
FROM table WHERE skillname = ''
UNION ALL
SELECT table.* 
FROM table JOIN skills 
  ON table.skillname = skills.name AND table.skilllevel >= skills.level
WHERE skills.user = 'Mikhail'

至于查询的术语,@guide 指出您运行了一个行子查询,并使用行构造函数 语法将其与文字行进行了比较。 SQL 允许您使用列、表达式或值创建匿名行,并在某些情况下使用它们,例如与具有兼容列数的另一行进行比较。我将此称为行比较

你也可以在连接条件中使用它,但是如果你想对一列进行相等比较而对另一列进行不等式比较,那就真的不清楚了:

SELECT table.* 
FROM table JOIN skills 
  ON (table.skillname, table.skilllevel) >= (skills.name, skills.level)
WHERE skills.user = 'Mikhail'

以上可能不会做你想要的。示例:

SELECT (1,2) = (1,2);   -- returns true (i.e. 1 in MySQL)

SELECT (1,2) >= (1,2);  -- returns true

SELECT (1,3) >= (1,2);  -- returns true

SELECT (1,2) >= (1,3);  -- returns false

SELECT (2,3) >= (1,2);  -- returns true

SELECT (1,3) >= (2,2);  -- returns false

相同的比较运算符应用于这些行中的所有列。但它也会短路(与 AND 不同):

SELECT (2,3) >= (1,4);  -- returns true

2 大于 1,但 3 不大于 4。令人困惑?考虑按字母顺序排列的示例:

SELECT ('Smith', 'Agent') >= ('Anderson', 'Thomas'); -- returns true

Smith 比 Anderson 大,但 Agent 不比 Thomas 大。尽管如此,我们知道如何在电话簿中对这两个名字进行排序。

所有这一切的要点是,如果您想更好地控制比较,则需要编写完整的 bool 表达式。

关于mysql - MySQL IN 子句的特点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6986204/

相关文章:

mysql - MySQL服务器的初始密码是多少?

php - 如何在 codeigniter 中正确地为表起别名?

c#优化选择字符串创建循环

javascript - 有没有比 "if-else"链更短的赋值方法?

php - 无法从数据库检索数据 PHP、AJAX

用于附近使用的正确语法的 MySQL 服务器版本

MySQL 可选约束

python - 计算列表中非唯一项的总数

xcode - 如何在 Xcode 中打开优化?

Java:绘制文本最快的方法?