作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我刚刚使用 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
,...) expr
和 value
都可以是多列。
这叫什么,还有更多类似的快捷方式吗?
更重要的是 - 有没有办法将此查询转换为匹配 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/
我是一名优秀的程序员,十分优秀!