2013-07-15 8 views
1

J'ai une table de commentaires qui contient les évaluations des utilisateurs et les évaluations selon certaines entités. Il y a des cas où plusieurs utilisateurs ont voté sur la même entité qui n'est pas souhaitable et qui sont entrés dans le système en raison d'un problème.Comment sélectionner des données complexes à partir d'une table et les supprimer de la même table

Le schéma de la table est un peu comme ceci:

qa_id,int(10) //id of the entity 
score,smallint(1) 
user_id,int(3) 
feed_time,datetime 

je tentais de supprimer l'une des entrées en double (heureusement il n'y a qu'une rétroaction supplémentaire) avec cette requête:

delete from feedback where md5(qa_id+feed_time) in 
(
    select md5(qa_id+feed_time)from feedback fb 
    group by fb.qa_id 
    having count(fb.qa_id) > 1 
    order by fb.qa_id 
    desc 
) 

Il n'indique pas:

Error Code : 1093 
You can't specify target table 'feedback' for update in FROM clause 
(0 ms taken) 

que je ne peux pas sélectionner et supprimer du même tableau (c'est-à-dire si apparaît dans une sous-requête). Je n'ai pas beaucoup d'expertise dans les bases de données et je ne suis pas autorisé à utiliser un langage de programmation pour faire la même chose. ? :(

Toutes les suggestions sur la façon dont je peux le faire avec des requêtes seulement

+0

Commander sur le lien plus tard sur ce commentaire, il vous donne la réponse. Votre table est innodb ou MySIAM? http://stactkoverflow.com/questions/10554627/delete-from-having-count-in-mysql –

+0

@Yoram Ma table est InnoDB –

+0

Oke, vérifie juste parce que mysiam verrouille la table en faisant une insertion, une mise à jour ou une suppression etc. mais il est également impossible de le faire à la caisse le lien :) –

Répondre

3

La meilleure façon de résoudre ce problème dans MySQL est de mettre la sous-requête dans une couche supplémentaire de sous-requête:

delete from feedback 
where md5(qa_id+feed_time) in (select * 
           from (select md5(qa_id+feed_time) 
            from feedback fb 
            group by fb.qa_id 
            having count(fb.qa_id) > 1 
            ) t 
          ) 
+0

LOL ... quel genre de sorcellerie est-ce !! ?? Faire du fou hors de MySQL. : D –

+2

@RickeshJohn. . . Le niveau supplémentaire de sous-requête force MySQL à instancier la table (ou au moins pour que le compilateur réalise que la table est instanciée, en ignorant l'avertissement). –

Questions connexes