gpt4 book ai didi

mysql - MySQL IN 子句的特点

转载 作者:可可西里 更新时间:2023-11-01 07:31:29 25 4
gpt4 key购买 nike

我刚刚使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com