编辑: 我编辑帖子,增加了一些复杂性。如果盒子包含重复的条形码怎么办?条形码222222222222在盒子中存在两次。并且在主表(或仓库)中存在3次。 查询怎么样才能删除2个条形码?
我选择的答案将盒子的条形码分组,因此,只删除其中一个。
大家好,
I have this table
Barcodes
+--+------------------+-------+
|ID|Barcode |DELETE |
+--+------------------+-------+
|1 | 11111111111111 | 0 |
|2 | 22222222222222 | 0 |
|3 | 22222222222222 | 0 |
|4 | 22222222222222 | 0 |
|5 | 33333333333333 | 0 |
|6 | 33333333333333 | 0 |
|7 | 33333333333333 | 0 |
|8 | 44444444444444 | 0 |
+--+------------------+-------+
ID是一个自动增量字段。
每一行都是条形码,代表同一项目的1个单位。例如,我有3个项目由条形码33333333333333
表示每当任何用户扫描条形码并且匹配时,我都会在处理完成时标记要删除的条形码。
update barcodes
set delete=-1
where id=(select max(barcode) as maxi from barcodes where barcode like 'x' and delete>-1)
这相当快。但有时,用户可以扫描一个包含多达150个项目的框,而不是逐个扫描项目。 后端是远程服务器中的mysql表,前端是ms访问。
BOX
+------------------+
|Barcode |
+------------------+
| 22222222222222 |
| 22222222222222 |
| 33333333333333 |
| 44444444444444 |
+------------------+
我使用循环,对于框中的每个项目,我重复sql查询,但由于延迟,这对150个项目框最多需要3分钟。
您是否知道任何类型的查询会更新我的条形码表与阅读框中的那些?
它的输出类似于:
+--+------------------+-------+
|ID|Barcode |DELETE |
+--+------------------+-------+
|1 | 11111111111111 | 0 |
|2 | 22222222222222 | -1 |
|3 | 22222222222222 | 0 |
|4 | 33333333333333 | -1 |
|5 | 33333333333333 | 0 |
|6 | 33333333333333 | 0 |
|7 | 44444444444444 | -1 |
+--+------------------+-------+
如果销售完成,我只会删除标记为delete = -1
的那些答案 0 :(得分:0)
您可以使用以下查询来选择要删除的行的id
值:
SELECT MIN(id)
FROM Barcodes AS b1
INNER JOIN BOX AS b2 ON b1.Barcode = b2.Barcode
WHERE `DELETE` <> -1
GROUP BY b1.Barcode
如果您在原始SELECT
查询中使用上述UPDATE
查询,则可以获得所需内容:
UPDATE Barcodes
SET `DELETE` = - 1
WHERE id IN ( SELECT minID
FROM (SELECT MIN(id) AS minID
FROM Barcodes AS b1
INNER JOIN BOX AS b2 ON b1.Barcode = b2.Barcode
WHERE `DELETE` <> -1
GROUP BY b1.Barcode) AS t )
以上在MySQL中有效。请参阅demo here。
请注意,您需要将SELECT
查询包装在子查询中,因为MySQL不允许您在'Barcodes'
子句中为更新指定目标表FROM
。