我的SQL不等于不工作

时间:2017-02-04 15:40:58

标签: mysql sql

我试图从table1获取数据,将其字段与table2进行比较,其中两个值都不相等

例如

news:
--
id, title
1   test
2   teeest
3   tet

newsseen:
id, newsId
1   1
2   2

以下是!=的查询,

SELECT n.id, n.title, n.CreatedOn FROM news n , newsseen ns WHERE n.id != ns.newsId group by n.id;

它返回新闻表中的所有数据,而不是仅返回第3行

但如果我查看=

,以下查询的工作正确无误
SELECT n.id, n.title, n.CreatedOn FROM news n , newsseen ns WHERE n.id = ns.newsId group by n.id;

只返回前2行。

我可以知道为什么并且可以得到解决方案吗?

2 个答案:

答案 0 :(得分:2)

您正在寻找NOT EXISTS

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

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

类似于Id=2表中的newsnewsId=1表中存在不匹配的记录(即)newsseen,因此Id=2也将被返回。

对于Id=3表格中的news

,这两条记录在newsseen中都不匹配,因此Id=3也将返回

答案 1 :(得分:1)

这是正确的做法。你想要的是做一个基于集合的"平等,看看是否匹配。这需要LEFT JOIN

SELECT n.id, n.title, n.CreatedOn
FROM news n LEFT JOIN
     newsseen ns 
     ON n.id = ns.newsId 
WHERE ns.newsId IS NULL;

我认为没有理由GROUP BY

并且,我应该添加我的常用:从不FROM子句中使用逗号。 始终使用明确,正确的JOIN语法。

(您也可以使用NOT EXISTSNOT IN轻松表达这一点,但您的方法建议LEFT JOIN。这三者的表现应该相似。)