我有一个两个表,用户使用旧格式和新格式。我想将具有旧格式的用户匹配到单独的表中,然后排除也出现在新用户格式表中的所有用户。我的数据是这样的:
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表中的相应条目。
答案 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秒执行,因此肯定会使用我自己的代码。