2012-02-24 48 views
0

我有兩個DB tabels形成從Planung一個父子關係Aufgabe:查找每個父ID重複

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 per Planung。或者換句話說:對於每個Planung Aufgabe.Nummer都必須是獨一無二的,我想檢查一下這是否屬於我的數據庫(我知道它不是)。

+3

您可能會考慮在表aufgabe上使用由'planung_id,nummer'組成的唯一索引。 (當然,你清理後)。 – dgw 2012-02-24 12:52:55

回答

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,存在3 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) 
+0

+1,用於添加「GROUP_CONCAT」和解釋。 – dgw 2012-02-24 12:57:57

+0

非常感謝,作品完美。 – BetaRide 2012-02-24 13:32:50

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 
+0

這是行不通的,因爲a.id是group的一部分。 – dgw 2012-02-24 12:57:28

+0

我確實得到一個空的結果。 – BetaRide 2012-02-24 13:36:27

+0

是啊,我不知道我在抽菸,只是從選擇和組中刪除了a.id,並且您還有其他答案 – mindandmedia 2012-02-24 13:38:31

0

這會給你的所有元素planung比一次更父。

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

這會給你每planung_id有多個Nummer值:如果您需要強制執行

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

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

如果您還需要aufgabe.id,你可以這樣做在任何時候,考慮在{planung_id, Nummer}上添加一個密鑰(正如@dgw已經建議的那樣)。