Mysql 我的SQL不等于不工作
我试图从表1中获取数据,将其字段与表2中两个值不相等的字段进行比较 如: 以下是我对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
的查询=代码>,
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一点也不重要。如前所述,您可以通过运行实时数据来检查这两个查询的性能