2014-03-12 47 views
0

我有一些数据一致性问题,由于一个错误而发生。SQL查询崩溃PHPMYADMIN - 问题与查询逻辑

现在我试图对它进行整理,但是当我运行我的测试查询的一部分phpmyadmin崩溃或在很长一段时间内变得没有响应时出现问题。 我试着自己运行嵌套子查询,他们工作正常。

基本上我试图解决的问题是:

如何删除重复resource_type=1 FROM geo_address从拥有所有用户超过一个resource_type=1 WHERE用户也有geo_addressresource_type=2

基本上这意味着如果用户有一个和1 resource_type=2他有一个重复resource_type=1。如果用户有2 resource_type=1但没有resource_type=2那么它会陷入另一种情况,我不在这里解决。

我在我的SQL查询的逻辑找到了巨大的麻烦

我至今想出了是这样的,但我知道它fundamentaly错了,因为它崩溃

我怎么能正确地构建我的查询?

SELECT member_num 
    FROM geo_address2 
WHERE  id IN (SELECT id 
        FROM geo_address2 
        WHERE resource_type=1 
       GROUP BY member_num 
        HAVING COUNT(resource_type) > 1 
     ) 
     AND id IN (SELECT id 
        FROM geo_address2 
        WHERE resource_type=2 
       GROUP BY member_num 
        HAVING COUNT(resource_type) = 1 
     ) 
+1

可你给在sqlfiddle数据的例子吗? –

+0

用户具有“重复”记录,哪一个是你想保留的记录? – eggyal

+0

@eggyal如果存在重复,我想保留'resource_type = 1'的MIN(id)'记录 –

回答

2

经过一番讨论,我编辑了答案。
一种选择是使用此查询:

DELETE 
    FROM geo_address2 
WHERE id IN (SELECT DISTINCT g12.id 
       FROM (SELECT member_num, 
          id 
         FROM geo_address2 
         WHERE resource_type = 1) g1 
       JOIN 
        (SELECT member_num, 
          id 
         FROM geo_address2 
         WHERE resource_type = 1) g12 
        ON g1.member = g12.member AND g1.id > g12.id 
        (SELECT member_num, 
          id 
         FROM geo_address2 
         WHERE resource_type = 2) g2 
        ON g1.member_num = g2.member_num 
       ); 

第二(我相信这在逻辑上是相同的):

DELETE 
    FROM geo_address2 
WHERE id IN (
      SELECT g1.id 
       FROM geo_address2 g0 
        JOIN geo_address2 g1 
         ON (g0.member_num = g1.member_num 
          AND g0.id > g1.id 
          AND g0.resource_type = 1 
          AND g1.resource_type = 1) 
        JOIN geo_address2 g2 
         ON (g1.member_num = g2.member_num 
          AND g0.resource_type = 1 
          AND g2.resource_type = 2) 
       ); 
+0

你用cnt计算什么?没有定义 –

+0

@JonathanThurft在'SELECT'中编辑了别名,但忘记在'HAVING'中修改。固定 – Alexander

+0

如果有重复,我想保留'最小(id)'与'resource_type = 1',如果有重复并删除其他'resource_type = 1' –

0
DELETE dupe 
FROM geo_address2 dupe 
    JOIN geo_address2 keep 
    ON dupe.id > keep.id 
    AND dupe.member_num = keep.member_num 
    AND dupe.resource_type = keep.resource_type 
    JOIN geo_address2 save 
    ON save.member_num = dupe.member_num 
    AND save.resource_type = 2 
WHERE dupe.resource_type = 1