Есть ли запрос на удаление дубликатов из коллекции в зависимости от того, где условие в MySQL? - PullRequest
1 голос
/ 05 апреля 2019

Я пишу запрос в рельсах. У меня есть таблицы под названием Школа и Навыки. Умение имеет столбцы

id: integer
name: text 
school_id: integer

У меня есть @skills, в котором есть несколько строк. Но у @skills могут быть повторяющиеся имена.

Я хочу удалить повторяющиеся строки из @skills, где school_id == 1.

Например, если @skills возвращает


#<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>,]

Здесь Skill ID 258 и 259 имеют одинаковые имена. Поэтому я хочу удалить 259, потому что он имеет school_id == 1.

Я использовал следующий запрос SQL, но он выбирает MIN (id).

SELECT MIN(id) as id, school_id 
FROM `skills` 
GROUP BY `skills`.`tag_id`,  
`skills`.`tag_type`, `skills`.`school_id`, `skills`.`master_tag_id`

Могу ли я удалить дубликаты таким образом? И я хочу сделать это в одном запросе.

Примечание. Решение в ActiveRecord приветствуется.

Ответы [ 3 ]

1 голос
/ 05 апреля 2019
select * from skills where id in (select MIN(id) from skills group by  name); 
1 голос
/ 05 апреля 2019

Вы можете попробовать этот запрос:

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

Он использует нумерацию строк в группах на основе столбца name.Затем каждая группа сортируется по school_id по убыванию, поэтому school_id идет последним.Тогда достаточно выбрать эти записи с rn равным единице.

0 голосов
/ 05 апреля 2019

Используйте метод подзапроса. Первая группа @skills таблица, используя Schol_id и имя.Тогда извините фактический оператор выбора.

select * from skills where id in (select id from skills group by school_id, name); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...