从代码循环到Sql查询?

时间:2015-09-20 14:32:11

标签: mysql sql loops ms-access

编辑: 我编辑帖子,增加了一些复杂性。如果盒子包含重复的条形码怎么办?条形码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

的那些

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