【问题标题】:from code loop to Sql query?从代码循环到 Sql 查询?
【发布时间】:2015-09-20 14:32:10
【问题描述】:

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

【问题讨论】:

  • @GordonLinoff "后端是远程服务器中的mysql表,前端是ms访问。"
  • 没错,解决方案可能会影响 ms-access 或 mysql(或两者,我还不知道),因此我添加了两个标签
  • 所以你说有一天你可能会选择拥有一个 ms-access 数据集,所以你想要一个同时支持两种语言的解决方案
  • 没有;我只是在告知设置情况。

标签: mysql sql loops ms-access


【解决方案1】:

条形码的数据类型是什么?避免分组以加快更新速度。请注意,尽管使用了具有该名称的列,但您并没有删除任何内容。删除 sql 中的 like> 并将它们替换为 = 逻辑,对于 mysql 服务器端代码如下所示:

update barcodes
set delete=-1
where id=(select id from barcodes where barcode='x' and delete=0 ORDER BY id DESC LIMIT 1)

您必须调整以上内容以适应您示例中 x 的具体情况。

【讨论】:

    【解决方案2】:

    您可以使用以下查询来选择要删除的行的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
    

    如果您在原来的UPDATE 查询中使用上述SELECT 查询,那么您就有了您所需要的:

    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 不允许您在 FROM 子句中指定目标表 'Barcodes' 进行更新。

    【讨论】:

    • 太棒了!这听起来很不错。非常感谢
    • 好吧,我认为这会起作用,但是一旦盒子包含重复的条形码,就会从邮件表中删除一个。
    • @Fran 这与最初在 OP 中发布的要求完全不同。我认为您最好发布一个不同的问题,而不是编辑这个问题。
    猜你喜欢
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多