J'écris une requête dans rails. J'ai des tables appelées École et Compétence. Skill a des colonnes
SELECT MIN(id) as id, school_id FROM `skills` GROUP BY `skills`.`tag_id`, `skills`.`tag_type`, `skills`.`school_id`, `skills`.`master_tag_id`
J'ai @skills qui contient quelques lignes. Mais @skills peut avoir des noms en double.
Je souhaite supprimer les lignes en double de @skills où school_id == 1.
Par exemple, si @skills renvoie
#<ActiveRecord::Relation [#<Skill id: 249, name: "3 D Priniting", school_id: 1>, #<Skill id: 258, name: "Cinematography", school_id: 11>, #<Skill id: 174, name: "Sports", school_id: 1>, #<Skill id: 259, name: "Cinematography", school_id: 1>, #<Skill id: 300, name: "Sales", school_id: 11>, #<Skill id: 301, name: "Marketing", school_id: 11>,]
Ici, les Skill id 258 et 259 ont le même nom. Je veux donc supprimer 259 car il a school_id == 1.
J'ai utilisé la requête SQL suivante, mais il sélectionne le MIN (id).
id: integer name: text school_id: integer
Puis-je supprimer les éléments en double de cette façon? Et je veux faire cela en une seule requête.
Remarque: La solution dans ActiveRecord est appréciée.
3 Réponses :
Vous pouvez essayer cette requête:
set @lagName := ''; set @rn := 0; select id, name, school_id from ( select case when @lagName = name then @rn:=@rn+1 else @rn:=1 end rn, @lagName:=name, id, name, school_id from Skills order by name, school_id desc ) a where rn=1
Elle utilise le repérage des lignes dans les groupes en fonction de la colonne name
. Chaque groupe est ensuite trié par school_id
desceindingly, donc school_id
vient en dernier. Ensuite, il suffit de choisir ces enregistrements avec rn
égal à un.
Utilisez la méthode Subquery.First group @skills table utilisant Schol_id et name. Ensuite, exécutez la déclaration de sélection réelle.
select * from skills where id in (select id from skills group by school_id, name);
select * from skills where id in (select MIN(id) from skills group by name);
Max (Id) inclura l'ID de ligne de compétence 259. Utilisez min (id) pour l'exclure du résultat de la sous-requête
@AnanthCool Ohh désolé, c'était par erreur, merci de m'avoir corrigé :)