【问题标题】:Why my MySQL statement doesn't return any records when the where clause with ALL returns true?为什么当带有 ALL 的 where 子句返回 true 时,我的 MySQL 语句不返回任何记录?
【发布时间】:2020-05-22 13:11:17
【问题描述】:

我有两张桌子:

create table m1 (id int, name varchar(255));
insert into m1 (id, name) values 
 (1, 'tingwei'),
 (2, 'jiahui'),
 (3, 'naidan'),
 (5, 'weizhi'),
 (9, 'siyao');

create table m2 (newid int, name varchar(255));
insert into m2 (newid, name) values 
 (1, 'leijun'),
 (2, 'wangjianlin'),
 (3, 'wangjianlin'),
 (5, 'wangjianlin'),
 (9, 'wangjianlin');

我想得到 m1 中所有满足条件的字段,即 m1 中的所有 id 值与 m2 中的所有 newid 值相同,这是我的代码:

select * from m1
where id = all (select newid from m2);

但是我返回了 0 条记录。 id 和 newid 的所有值都相同:1,2,3,5,9。我认为 where 子句应该返回 TRUE。为什么?

【问题讨论】:

  • 这不是ALL 子查询所做的。您要求选择 id 等于 m2 中所有 id 的 m1 行,这是不可能的,因为它们并不完全相同。
  • 哦。也许我对 ALL 的概念理解有误。你能给我一个在这种情况下使用 ALL 的示例代码吗?
  • @ChrisMa 我建议您查看我在回答中链接到的手册页。

标签: mysql where-clause


【解决方案1】:

您的查询不返回任何结果,因为它要求m1 中的每个id 值与m2 中的newid所有相同,并且由于1 不是等于2359 不返回该行,同样适用于其他行。请参阅subqueries with all 上的手册。

我认为您真正想要的是newid 上的JOIN,它将返回m1 中的行,其id 值存在于newid 中的m2 中:

SELECT m1.*
FROM m1
JOIN m2 ON m2.newid = m1.id

或者可能是IN 表达式:

SELECT m1.*
FROM m1
WHERE id IN (SELECT newid FROM m2)

输出(针对您的样本数据的两个查询):

id  name
1   tingwei
2   jiahui
3   naidan
5   weizhi
9   siyao

Demo on dbfiddle

【讨论】:

    猜你喜欢
    • 2013-01-07
    • 2014-09-03
    • 2011-09-07
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多