首页 > 解决方案 > mysql选择不同并丢弃其他

问题描述

我有这个表,我想在 mysql 表中将所有第一项标记为 OK,将所有其他项目标记为拒绝,并将它们的状态更改为 Not Ok

我们可以使用 PHP 对每个产品进行一次查询吗?

这是表结构

id      prod_id   position  status 

3056620 4610395144282   20  0
3056619 4610395144282   7   0
3020612 4610395144282   19  0
3020611 4610395144282   7   0
3020610 4610395144282   6   0
2996086 4610395144282   17  0
2996085 4610395144282   6   0
2996055 4610395144282   17  0
2996054 4610395144282   6   0
2994301 4610395144282   29  0
2994300 4610395144282   16  0
2994299 4610395144282   6   0
2994279 4610395144282   26  0
2994278 4610395144282   19  0
2994277 4610395144282   15  0
2994276 4610395144282   11  0
2994275 4610395144282   6   0
2989321 4610395144282   24  0
2989320 4610395144282   22  0
2989319 4610395144282   19  0
2989318 4610395144282   17  0
2989317 4610395144282   13  0
2989316 4610395144282   10  0
2989315 4610395144282   8   0
2989314 4610395144282   6   0

我想将prod_id 位置重复为 1 的所有此类列标记

例如,我们可以看到 Prod_id 4610395144282 位置 7 出现了 2 次,所以我将忽略第一次出现并将所有其他出现标记为状态 1。接下来是位置6出现了几次。我将忽略第一次出现或最后一次出现,并将所有其他标记为 status=1,对于同一产品具有相同的位置。

first 和 last 由 id 过滤。order by id desc limit 1 任何帮助都会很棒。我可以通过使用 distinct 但如何将其他人标记为状态 1 来获得唯一行。我们使用 php 并希望找出一些快速的方法

标签: phpmysql

解决方案


如果您使用 MySQL 8.0 或更高版本,您可以使用窗口函数来实现 -

UPDATE YOUR_TABLE S
JOIN (SELECT *
      FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY position ORDER BY id) RN
            FROM YOUR_TABLE)
      WHERE RN = 1) T ON S.id = T.id
                     AND S.prod_id = T.prod_id
                     AND S.position = T.position
SET S.status = 1;

如果您使用的是较低版本,您可以使用子查询生成 row_number -

UPDATE YOUR_TABLE S
JOIN (SELECT id, prod_id, position
      FROM (SELECT id, prod_id, @row_number:=CASE WHEN @position=position
                                                       THEN @row_number + 1
                                                  ELSE 1
                                             END AS rn, @position:=position position
            FROM YOUR_TABLE
            CROSS JOIN (SELECT @row_number :=0, @position := 1) vars
            GROUP BY position
            HAVING COUNT(position) > 1
            ORDER BY position) X
      WHERE RN = 1) T ON S.id = T.id
                     AND S.prod_id = T.prod_id
                     AND S.position = T.position
SET S.status = 1;

演示。


推荐阅读