Mysql 我的SQL不等于不工作

Mysql 我的SQL不等于不工作,mysql,sql,Mysql,Sql,我试图从表1中获取数据,将其字段与表2中两个值不相等的字段进行比较 如: 以下是我对的查询=, SELECT n.id, n.title, n.CreatedOn FROM news n , newsseen ns WHERE n.id != ns.newsId group by n.id; 它返回新闻表中的所有数据,而不是仅返回第三行 但是如果我使用= SELECT n.id, n.title, n.CreatedOn FROM news n , newsseen ns WHERE n.id

我试图从表1中获取数据,将其字段与表2中两个值不相等的字段进行比较

如: 以下是我对
的查询=,

SELECT n.id, n.title, n.CreatedOn FROM news n , newsseen ns WHERE n.id != ns.newsId group by n.id;
它返回新闻表中的所有数据,而不是仅返回第三行

但是如果我使用
=

SELECT n.id, n.title, n.CreatedOn FROM news n , newsseen ns WHERE n.id = ns.newsId group by n.id;
它只返回前2行


我能知道为什么吗?我能找到解决办法吗?

它正在做正确的事情。你想要做的是做一个“基于集合的”相等,看看是否没有匹配的。这需要一个
左连接

SELECT n.id, n.title, n.CreatedOn
FROM news n LEFT JOIN
     newsseen ns 
     ON n.id = ns.newsId 
WHERE ns.newsId IS NULL;
我看不出有任何理由使用
分组方式

而且,我应该加上我的惯常用法:在
FROM
子句中永远不要使用逗号。始终使用明确、正确的
JOIN
语法


(你也可以用
NOT EXISTS
NOT IN
来表达这一点,但是你的方法建议
左连接
。这三者应该有类似的性能。)

这是正确的做法。你想要做的是做一个“基于集合的”相等,看看是否没有匹配的。这需要一个
左连接

SELECT n.id, n.title, n.CreatedOn
FROM news n LEFT JOIN
     newsseen ns 
     ON n.id = ns.newsId 
WHERE ns.newsId IS NULL;
我看不出有任何理由使用
分组方式

而且,我应该加上我的惯常用法:在
FROM
子句中永远不要使用逗号。始终使用明确、正确的
JOIN
语法


(您也可以用
不存在
不存在
来表达这一点,但您的方法建议
左加入
。这三者应该具有类似的性能。)

您正在寻找
不存在

SELECT n.id, n.title, n.CreatedOn 
FROM news n 
WHERE Not exists (select 1 from newsseen ns where n.id = ns.newsId )

在第一次查询中,对于
news
表(ie)
1
中的第一个
Id
。根据您的情况
n.id!=ns.newsId
newsseen
表中有一条记录不相等(即
newsId=2
),因此将返回
ID=1

类似地,对于
Id=2
news
表中,有一条不匹配的记录(即
newside=1
出现在
newseen
表中,因此也将返回
Id=2


对于
news
表中的
Id=3
,这两条记录在
newsseen
中都不匹配,因此
Id=3
也将被返回

您要查找的
不存在

SELECT n.id, n.title, n.CreatedOn 
FROM news n 
WHERE Not exists (select 1 from newsseen ns where n.id = ns.newsId )

在第一次查询中,对于
news
表(ie)
1
中的第一个
Id
。根据您的情况
n.id!=ns.newsId
newsseen
表中有一条记录不相等(即
newsId=2
),因此将返回
ID=1

类似地,对于
Id=2
news
表中,有一条不匹配的记录(即
newside=1
出现在
newseen
表中,因此也将返回
Id=2


对于
news
表中的
Id=3
,两条记录在
newsseen
中都不匹配,因此
Id=3
也将被返回

而无需子查询,请?@vinothbab-Gordan已经使用
左连接发布了答案。但是为什么没有
子查询
?我觉得
不存在
是正确的做法this@VinothBabu-不,至少在这种情况下不会。您可以通过运行实时数据来检查这两个查询的性能。如果子查询返回的数据超过2k,那么它会工作吗?另外,select 1将在子查询(即newsId)中返回什么?@VinothBabu-当然可以。2k一点也不重要。正如我前面所说的,您可以通过运行实时数据来检查这两个查询的性能,而无需子查询。请?@VinothBabu-Gordan已经使用
左连接发布了答案。但是为什么没有
子查询
?我觉得
不存在
是正确的做法this@VinothBabu-不,至少在这种情况下不会。您可以通过运行实时数据来检查这两个查询的性能。如果子查询返回的数据超过2k,那么它会工作吗?另外,select 1将在子查询(即newsId)中返回什么?@VinothBabu-当然可以。2k一点也不重要。如前所述,您可以通过运行实时数据来检查这两个查询的性能