删除mysql表中包含空字段的行,其中存在更完整的行

问题描述 投票:0回答:1

我有一个表,将战争纪念馆的 ID 与士兵记录的 ID 联系起来。它有一个基于两个 ID 组合的唯一索引(下面的示例数据)。

我最近开始存储这些连接的来源,通常是 URL。我想要做的是删除所有没有源的行除了那些我仍然没有存储源的行。

举例来说

id | memorialId | soldierId | source
1  | 1          | 1         | Source 1
2  | 1          | 1         | Source 2
3  | 1          | 1         |
4  | 2          | 1         | Source 3
5  | 2          | 1         |
6  | 3          | 2         | Source 4
7  | 4          | 3         |
8  | 5          | 4         | Source 1
9  | 5          | 4         | Source 2

这最终应该是

memorialId | soldierId | source
id | memorialId | soldierId | source
1  | 1          | 1         | Source 1
2  | 1          | 1         | Source 2
4  | 2          | 1         | Source 3
6  | 3          | 2         | Source 4
7  | 4          | 3         |
8  | 5          | 4         | Source 1
9  | 5          | 4         | Source 2

第3行被删除,因为没有源,第1行和第2行具有相同的连接,但有源;与 5 号线类似,因为 4 号线有该连接的源。

第 6 行保留,因为它是定义该连接的唯一行。

第 7 行出于同样的原因保留,尽管它没有来源。

第 8 行和第 9 行均保留,因为它是同一连接的两个不同源 - 我只想删除源为空的行。

到目前为止我得到的最接近的是一个查询,该查询标识需要删除哪些行

SELECT id,memorialId,soldierId,source FROM myTable 
GROUP BY memorialId,soldierId 
HAVING COUNT(*) > 1 AND min(source) = '';

这标识了要删除的两行,但如果我随后将其包装在删除语句中,例如

Delete from 
myTable where exists (select 1 FROM myTable 
GROUP BY memorialId,soldierId 
HAVING COUNT(*) > 1 AND min(source) = '');

我收到一条消息,说我无法更新 FROM 子句中的同一个表。

我可能错过了一些明显的东西,因为我恐怕只有 mysql 的基本知识。

mysql delete-row
1个回答
0
投票

我会这样做:

DELETE t1 FROM myTable AS t1
JOIN myTable AS t2 USING (memorialId, soldierId)
WHERE t1.source = '' AND t2.source <> '';

演示:https://www.db-fiddle.com/f/gyyTPJiRmhzWh4gSFgbqA4/0

© www.soinside.com 2019 - 2024. All rights reserved.