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)
3 Réponses :
p> éditer: Merci à @Quassnoi Commentaire ci-dessous ... Ce qui précède sera < EM> pas em> strong> 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 ... p> > la sous-requête doit fonctionner s>
# 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 CODE> Ne prend pas en charge les tableaux cibles dans les sous-candidats corrélés (Soyez-lui
Supprimer code> ou
Mettre à jour code>). 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 CODE>: Bien sûr, c'est ce qu'il était destiné.
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);
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
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 code> est
temporaire code>? On m'a dit qu'une table deux fois dans une requête est incompatible avec l'utilisation de
Table temporaire Code> à 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.