我有两个数据库表格,形成从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必须是唯一的,我想检查我的数据库中是否真的如此(我知道它不是)。
答案 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已经建议的那样)。