SUPPRESSION D'AVOIR COUNT(*) dans MySQL
Ok, donc il y a quelques posts ici déjà, de ce et encore moins sur le web. J'ai vraiment tout essayé, l'un d'eux et ne peut pas obtenir quoi que ce soit au travail. J'espère que quelqu'un ici peut prendre pitié de moi 🙂
Voici les données que je travaille avec. Je veux supprimer tous ces enregistrements.
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)
Le plus proche que je suis arrivé à trouver le code qui ferait il est indiqué ci-dessous. La syntaxe des contrôles ok et il fonctionne, mais il semble juste d'accrocher la base de données. J'ai laisser tourner pendant 10 minutes et rien ne se passe jamais donc j'ai abandonner.
DELETE
FROM ag_master
WHERE part_id IN (
SELECT part_id
FROM ag_master
GROUP BY part_desc
HAVING COUNT(*) > 1000
);
Voici le plan d'expliquer sur la tmp table
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)
Pourquoi les deux requêtes select différent, votre première diffère de votre second? Aussi, je considérerai que vous souhaitez supprimer 1092+1401+1411+1997+3425 = 9,326 enregistrements?
Pas sûr de ce que tu veux dire? On est juste en vous montrant les données que je veux me débarrasser de l'autre est ce que la méthode recommandée pour le format d'une instruction delete tout en utilisant le devoir compter.
Oui, je veux me débarrasser de tous les 9k + enregistrements.
La première requête
C'est toute la ligne je suis d'essayer de se débarrasser de Rippo
Pas sûr de ce que tu veux dire? On est juste en vous montrant les données que je veux me débarrasser de l'autre est ce que la méthode recommandée pour le format d'une instruction delete tout en utilisant le devoir compter.
Oui, je veux me débarrasser de tous les 9k + enregistrements.
La première requête
DOES NOT
retour de la part_id, ajoutez-le à la première requête, puis vous devez ce que je veux dire!C'est toute la ligne je suis d'essayer de se débarrasser de Rippo
OriginalL'auteur RFQ Master | 2012-05-11
Vous devez vous connecter pour publier un commentaire.
Comme indiqué dans le manuel:
Je pense que vous aurez à effectuer cette opération via une table temporaire:
Oui, mais ensuite, vous supprimez tous les registres de
ag_master
qui correspondent à l'un de ces 5 descriptions (qui est ce que vous êtes après, non?).Ah, je vois ce que vous dites. Laissez-moi essayer...
Ok, cela ne semble pas fonctionner non plus. Il a couru pendant environ 12 minutes puis les sortir avec une " 2013. Perdu connect to MySQL server during query'
Avez-vous un indice sur
part_desc
? Pouvez-vous mettre dans une modification à votre question, la sortie deEXPLAIN SELECT * FROM ag_master WHERE part_desc IN (SELECT part_desc FROM temp)
?OriginalL'auteur eggyal
Une autre option est d'utiliser une jointure interne pour filtrer le résultat:
OriginalL'auteur Jonathan Heijmans