7
votes

MySQL Supprimer tous les résultats comptent (*) = 1

J'ai une table attachée avec deux champs Sesskey (Varchar32, Index) et Produits (Int11), je dois maintenant supprimer toutes les lignes qui ayant du groupe par sesskey comptent (*) = 1. J'essaie quelques méthodes de quelques-unes mais tout échoue.

Exemple: P>

delete from taged where sesskey in (select sesskey from taged group by sesskey having count(*) = 1)


0 commentaires

3 Réponses :


1
votes

la sous-requête doit fonctionner xxx

éditer: Merci à @Quassnoi Commentaire ci-dessous ... Ce qui précède sera < EM> pas travaille dans MySQL, car MySQL restreint en référence à la table mise à jour ou supprimée de, dans une sous-requête, je dois faire la même chose à l'aide d'une jointure ...


5 commentaires

# 1093 - Vous ne pouvez pas spécifier la table cible "Tagage" pour la mise à jour de la clause


Cette erreur est confuse ... Il n'y a pas de "mise à jour" ici ... Qu'est-ce que cela fait référence? L'utilisation du nom de Tablen Nom Oin la clause de suppression? ou l'utilisation du nom de table dans la sous-requête (qui ne met ni la mise à jour ni ne supprime quoi que ce soit)


MySQL Ne prend pas en charge les tableaux cibles dans les sous-candidats corrélés (Soyez-lui Supprimer ou Mettre à jour ). Oui, l'erreur est déroutante.


@Quassnoi, Thx, je ne le sais pas. N'utilisez pas MySQL, mais je me souviendrai de cela ... Je parie (supposons) cette règle s'applique également aux mises à jour qui ont des sous-candidats dans la clause WHER suivante - (je vais Prenez un coup dur et devinez que c'est ce que le message d'erreur a été réellement rédigé pour ...)?


@CHARDLES : Bien sûr, c'est ce qu'il était destiné.



1
votes

ou si vous utilisez une version plus ancienne (PRE 4.1) de MySQL et n'avez pas accès à des sous-candidatures, vous devez sélectionner vos données dans une table, puis rejoindre cette table avec l'original:

CREATE TABLE delete_me_table (sesskey varchar32, cur_total int);

INSERT INTO delete_me_table SELECT sesskey, count(*) as cur_total FROM orig_table
WHERE cur_total = 1 GROUP BY sesskey;

DELETE FROM orig_table INNER JOIN delete_me_table USING (sesskey);


0 commentaires

9
votes
DELETE  si
FROM    t_session si
JOIN    (
        SELECT  sesskey
        FROM    t_session so
        GROUP BY
                sesskey
        HAVING  COUNT(*) = 1
        ) q
ON      q.sesskey = si.sesskey
You need to have a join here. Using a correlated subquery won't work.See this article in my blog for more detail:
Keeping rows

3 commentaires

Pour une raison quelconque, cela n'a pas fonctionné pour moi dans une version récente MySQL. J'ai dû utiliser l'exemple de votre blog (Joindre de gauche, ID est NULL). J'ai réussi à supprimer les mauvaises lignes également: P (a dû utiliser n'est pas null pour mon cas)


Est-ce que cela fonctionne même si t_session est temporaire ? On m'a dit qu'une table deux fois dans une requête est incompatible avec l'utilisation de Table temporaire à cause d'un 13 ans "Impossible de rouvrir la table" Bug .


@DAMIANYERRICK: Je ne sais pas si cela fonctionne dans les versions récentes, mais ce n'est pas dans les anciens.