Php mysql选择distinct并丢弃其他

Php mysql选择distinct并丢弃其他,php,mysql,Php,Mysql,我有这个表,我想在mysql表中将所有第一项标记为OK,将所有其他项标记为rejected,并将其状态更改为Not OK 我们能用PHP对每个产品进行一次查询吗 这是表格结构 id prod_id position status 3056620 4610395144282 20 0 3056619 4610395144282 7 0 3020612 4610395144282 19 0 3020611 4610395144282 7 0 30206

我有这个表,我想在mysql表中将所有第一项标记为OK,将所有其他项标记为rejected,并将其状态更改为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

第一个和最后一个按id过滤。按id顺序描述限制1
任何帮助都会很好。我可以通过使用distinct获得唯一行,但如何将其他行标记为状态1。我们使用php,希望找到一些快速的方法

如果您使用的是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;
如果您使用的是较低版本,则可以生成带有子查询的行号,如下所示:-

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;

您对一些缺陷提出了疑问:什么是第一个,什么是最后一个,行是如何按id排序的…………您的MySQL版本是什么?MySQL 5.6.47…………注释不用于扩展讨论;这段对话已经结束。