2012-05-11 31 views
7

Dobrze, więc są tu już posty na kilka wpisów i jeszcze mniej w sieci. Dosłownie wypróbowałem każdego z nich i nie mogę dostać nic do pracy. Mam nadzieję, że ktoś tutaj zlituje się na mnie :)USUŃ OD KOSZYKA (*) w MySQL

Oto dane, nad którymi pracuję. Chcę usunąć wszystkie te rekordy.

SELECT 
part_desc, count(*) as rec_num 
FROM ag_master 
GROUP BY part_desc HAVING COUNT(*) > 1000; 

+--------------------------------------+---------+ 
| part_desc       | rec_num | 
+--------------------------------------+---------+ 
| SILICON DELAY LINE, TRUE OUTPUT  | 1092 | 
| LOADABLE PLD       | 1401 | 
| 8-BIT, FLASH, 8 MHz, MICROCONTROLLER | 1411 | 
| FPGA         | 1997 | 
| 8-BIT, MROM, 8 MHz, MICROCONTROLLER | 3425 | 
+--------------------------------------+---------+ 
5 rows in set (0.00 sec) 

Najbliższy znaleziony kod, który to zrobi, pokazano poniżej. Składnia sprawdza się poprawnie i działa, ale wydaje się, że zawiesza bazę danych. Pozwoliłem mu działać przez 10 minut i nic się nie dzieje, więc przerywam to.

DELETE 
FROM ag_master 
WHERE part_id IN (
    SELECT part_id 
    FROM ag_master 
    GROUP BY part_desc 
    HAVING COUNT(*) > 1000 
); 

Oto wyjaśnienie planu na stole tmp

mysql> EXPLAIN SELECT * FROM ag_master WHERE part_desc IN (SELECT part_desc FROM tmp); 
+----+--------------------+-----------+--------+---------------+------+---------+------+--------+-------------+ 
| id | select_type  | table  | type | possible_keys | key | key_len | ref | rows | Extra  | 
+----+--------------------+-----------+--------+---------------+------+---------+------+--------+-------------+ 
| 1 | PRIMARY   | ag_master | ALL | NULL   | NULL | NULL | NULL | 177266 | Using where | 
| 2 | DEPENDENT SUBQUERY | tmp  | system | NULL   | NULL | NULL | NULL |  1 |    | 
+----+--------------------+-----------+--------+---------------+------+---------+------+--------+-------------+ 
2 rows in set (0.00 sec) 
+0

Dlaczego są dwa wybierz inne zapytania, twój pierwszy różni się od drugiego? Również biorę to, że chcesz usunąć 1092 + 1401 + 1411 + 1997 + 3425 = 9,326 rekordów? – Rippo

+0

Nie jesteś pewien co masz na myśli? Jeden pokazuje tylko dane, których chcę się pozbyć, drugi to zalecany sposób sformatowania instrukcji usuwania podczas korzystania z licznika. –

+0

Tak, chcę pozbyć się wszystkich 9k + rekordów. –

Odpowiedz

10

Jak stwierdzono w the manual:

Obecnie nie można usunąć z tabeli i wybrać z tej samej tabeli w podkwerendzie .

Myślę, że będziesz musiał wykonać tę operację poprzez tabeli tymczasowej:

CREATE TEMPORARY TABLE temp 
    SELECT part_desc 
    FROM  ag_master 
    GROUP BY part_desc 
    HAVING COUNT(*) > 1000; 

DELETE FROM ag_master WHERE part_desc IN (SELECT part_desc FROM temp); 

DROP TEMPORARY TABLE temp; 
+0

Dzięki eggyal, faktycznie próbowałem, ale tworzy tylko 5 rekordów w tabeli tymczasowej, co odpowiada liczba wierszy, które są pogrupowane, ale nie liczba rekordów? –

+0

@RFQMaster: Tak, ale potem usuwasz wszystkie rekordy z 'ag_master' które pasują do któregokolwiek z tych 5 opisów (do czego właśnie się zaliczasz, nie?). – eggyal

+0

Ach, rozumiem, co mówisz. Pozwól mi spróbować ... –

5

Inną opcją jest użycie sprzężenie wewnętrzne, aby filtrować wyniki:

DELETE 
    ag_master.* 
FROM 
    ag_master 

    INNER JOIN 
    (
     SELECT 
      part_id 
     FROM 
      ag_master 
     GROUP BY 
      part_desc 
     HAVING COUNT(*) > 1000 
    )AS todelete ON 
      todelete.part_id = ag_master.part_id