Найти дубликаты для каждого родительского идентификатора - PullRequest
0 голосов
/ 24 февраля 2012

У меня есть две таблицы DB, которые образуют отношения родитель-потомок от Planung до Aufgabe:

Planung:

CREATE TABLE `planung` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `Bezeichnung` varchar(255) DEFAULT NULL,
   -- lots of ohter columns
  PRIMARY KEY (`id`),
) ENGINE=InnoDB

Aufgabe:

CREATE TABLE `aufgabe` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `planung_id` bigint(20) DEFAULT NULL, -- foreign key to Planung.id
  `Nummer` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  -- lots of ohter columns
) ENGINE=InnoDB 

Я ищу запрос, который дает мне все Planung.id и Aufgabe.ID для всех дубликатов Nummer на Planung. Или другими словами: для каждого Planung Aufgabe.Nummer должен быть уникальным, я хочу проверить, действительно ли это так в моей БД (я знаю, что это не так).

Ответы [ 4 ]

1 голос
/ 24 февраля 2012
SELECT planung_id, GROUP_CONCAT(id) AS aufgabe_id, Nummer, COUNT(1) as num_duplicates
FROM aufgabe
GROUP BY planung_id, Nummer
HAVING COUNT(1) > 1

Этот запрос выдает все planung_id с дублирующимся Nummer и отображает их следующим образом:

planung_id aufgabe_id Nummer num_duplicates
1          2,5,8      1      3

Это означает, что для Planung 1 существует три Aufgabe с Nummer 1, и они равны 2,5и 8.

Редактировать : бесстыдно украденный из комментария @ dgw : После того, как вы выполнили этот запрос и исправили все дубликаты.Добавьте уникальный индекс к aufgabe {planung_id, Nummer}, чтобы убедиться, что база данных поддерживает это ограничение:

ALTER TABLE aufgabe 
  ADD CONSTRAINT UNIQUE uq_planung_id_and_nummer (planung_id, Nummer)
1 голос
/ 24 февраля 2012
select p.id, a.id, a.Nummer from planung p
inner join aufgabe a on a.planung_id = p.id
group by p.id, a.id, a.Nummer having count(*) > 1
0 голосов
/ 24 февраля 2012

Это даст вам каждый planung_id, имеющий несколько Nummer значений:

SELECT planung_id
FROM aufgabe
GROUP BY planung_id
HAVING COUNT(DISTINCT Nummer) > 1

Если вам также нужен aufgabe.id, вы можете сделать это:

SELECT *
FROM aufgabe
WHERE
    planung_id IN (
        <query above>
    ) 

Если вам нужно постоянно применять это, рассмотрите возможность добавления ключа на {planung_id, Nummer} (как уже предлагал @dgw).

0 голосов
/ 24 февраля 2012

Это даст вам все элементы из планунга, являющиеся более чем одним родителем.

SELECT planung_id,nummer,COUNT(*)
  FROM aufgabe
 GROUP BY 1,2 HAVING COUNT(*)>1 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...