我一直在关注这个问题并在堆栈交换中查看了一些类似的情况,我读的越多,我得到的就越混乱! 我有一张表有以下内容:
id | zipcode | provider | channel
---------------------------------
1 | 91773 | 342 | 0
2 | 91773 | 2261 | 177
3 | 91773 | 5590 | 0
4 | 91773 | 5590 | 0
5 | 91773 | 5590 | 135
6 | 91773 | 5590 | 0
7 | 91773 | 6010 | 0
8 | 91773 | 6010 | 0
我想只保留一条记录,如果频道只有0,那么我们保留它。所以它应该归还:
id | zipcode | provider | channel
---------------------------------
1 | 91773 | 342 | 0
2 | 91773 | 2261 | 177
5 | 91773 | 5590 | 135
8 | 91773 | 6010 | 0
我尝试了很多查询,但都没有。提前谢谢。
修改 的 我已经尝试了一些给出的例子,但似乎没有回复正确的信息,更好的例子是使用这些,你可以看到原因: 插入unicorns值
(1, 91773, 342, 0),
(2, 91773, 2261, 177),
(3, 91773, 5590, 0),
(4, 91773, 5590, 0),
(5, 91773, 5590, 135),
(6, 91773, 5590, 0),
(7, 91773, 6010, 0),
(8, 91773, 6010, 0),
(9, 91776, 5590, 135),
(10, 91776, 5590, 0),
(11, 91776, 6010, 0),
(12, 91776, 6010, 0);
答案 0 :(得分:3)
这样的事情应该有用......
DELETE unicorns
FROM unicorns
WHERE id NOT IN (SELECT id
FROM (SELECT unicorns.provider,
Max(id) AS id
FROM unicorns
LEFT JOIN (SELECT provider,
Max(channel) AS channel
FROM unicorns
GROUP BY provider) p
ON p.provider = unicorns.provider
AND p.channel = unicorns.channel
WHERE p.provider IS NOT NULL
GROUP BY unicorns.provider) p2)
答案 1 :(得分:3)
您可以使用自联接执行此操作。如果你只是在做删除:
DELETE a
FROM foo a
JOIN foo b on (a.zipcode = b.zipcode AND a.provider = b.provider)
WHERE
a.channel < b.channel;
如果您想在删除之前查看数据(剩下的内容):
SELECT *
FROM foo
WHERE ID NOT IN (
SELECT a.id
FROM foo a
JOIN foo b on (a.zipcode = b.zipcode AND a.provider = b.provider)
WHERE
a.channel < b.channel);
答案 2 :(得分:0)
我认为你可以使用这样的东西:
delete from unicorns
where id not in (
SELECT * FROM (
SELECT MAX(id)
FROM unicorns
WHERE (provider, zipcode, channel) IN (
SELECT provider, zipcode, max(channel) mx_channel
FROM unicorns
GROUP BY provider, zipcode
)
GROUP BY provider, zipcode) s)
请参阅小提琴here。