1
votes

Existe-t-il une requête pour supprimer les doublons de la collection en fonction de la condition where dans mysql?

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.


0 commentaires

3 Réponses :


1
votes

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.


0 commentaires

0
votes

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); 


0 commentaires

1
votes
select * from skills where id in (select MIN(id) from skills group by  name); 

2 commentaires

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é :)