查找每个父ID的重复项

时间:2012-02-24 12:42:15

标签: mysql sql

我有两个数据库表格,形成从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 

我正在寻找一个查询,它为所有重复的Nummer per Planung提供所有Planung.id和Aufgabe.ID。换句话说:对于每一个Planung Aufgabe.Nummer必须是唯一的,我想检查我的数据库中是否真的如此(我知道它不是)。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

此查询提供具有重复Nummer的所有planung_id,并将其显示为:

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

这意味着,对于Planung 1,存在三个带有Nummer 1的Aufgabe,它们分别为2,5和8。

修改:从@dgw的评论中无耻地被盗: 运行此查询后,并更正所有重复项。向aufgabe {planung_id, Nummer}添加唯一索引以确保数据库维护此约束:

ALTER TABLE aufgabe 
  ADD CONSTRAINT UNIQUE uq_planung_id_and_nummer (planung_id, Nummer)

答案 2 :(得分:0)

这将为您提供来自planung的所有元素不止一次成为父母。

SELECT planung_id,nummer,COUNT(*)
  FROM aufgabe
 GROUP BY 1,2 HAVING COUNT(*)>1 ;

答案 3 :(得分:0)

这将为您提供具有多个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已经建议的那样)。