我有一个表,将战争纪念馆的 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 的基本知识。
我会这样做:
DELETE t1 FROM myTable AS t1
JOIN myTable AS t2 USING (memorialId, soldierId)
WHERE t1.source = '' AND t2.source <> '';