选择一个MYSQL结果,其中表一和二表匹配,两个和三个不匹配

时间:2015-05-07 12:35:54

标签: mysql select join subquery

我有一个两个表,用户使用旧格式和新格式。我想将具有旧格式的用户匹配到单独的表中,然后排除也出现在新用户格式表中的所有用户。我的数据是这样的:

Table newUsers:
+----+-------+-------+----------+
| id | oldid | first | last     |
+----+-------+-------+----------+
|  1 |    10 | John  | Kennedy  |
|  2 |    66 | Mitch | Kupchak  |
+----+-------+-------+----------+

Table posts:
+----+---------+
| id | user_id |
+----+---------+
|  1 |      10 |
|  1 |      66 |
|  1 |      88 | 
|  2 |      88 | 
|  2 |      28 | 
|  3 |      10 | 
+----+---------+

Table oldUsers:
+----+----------+-------+----------+
| id | username | first | last     |
+----+----------+-------+----------+
| 10 |        A | John  | Kennedy  |
| 66 |        B | Mitch | Kupchak  |
| 88 |        C | Dale  | Earnhardt|
+----+----------+-------+----------+

Result wantend:
+----+----------+-------+----------+
| id | username | first | last     |
+----+----------+-------+----------+
| 88 |        C | Dale  | Earnhardt|
+----+----------+-------+----------+

我想通过指定:posts.id = 1和posts.user_id = oldUsers.id以及newUsers.oldid!= oldUsers.id来选择我的结果,这样我只收到等于88的oldUser.id,因为他没有'在newUsers列表中。

我尝试了各种JOINS和SUBQUERIES。我不断得到所有结果,而不是结果减去newUsers表中的相应条目。

3 个答案:

答案 0 :(得分:0)

这是一种方法

select 
o.* from oldUsers o 
left join newUsers n on o.id = n.oldid 
left join posts p on  n.oldid = p.user_id or o.id = p.user_id 
where n.id is null and p.id= 1;

为了获得更好的性能,请添加以下索引

alter table newUsers add index oldid_idx(oldid);
alter table posts add index user_post_idx (id,user_id);

答案 1 :(得分:0)

select * from oldusers where id in

select * from

(select id from oldusers where id in
 select distinct userid from posts where id=1) 
 where id not in (select oldid from newusers);

答案 2 :(得分:0)

我最终找到了自己的答案然后来到这里寻找其他人的尝试。 Abhik的代码确实有效,但使用效率太低。我最终玩了自己的代码和IS NULL,直到找到更高效的东西。

select o.* from posts p, oldUsers o 
LEFT JOIN newUsers n ON o.id = n.oldid 
WHERE p.user_id = o.id AND p.id = 1 AND n.id IS NULL

执行.0044秒。我可以在生产网站上使用的东西。

从上一个答案中添加了索引,它现在以.001x秒执行,因此肯定会使用我自己的代码。