php - 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 并希望找出一些快速的方法
解决方案
如果您使用 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;
推荐阅读
- swift - swift5 - 枚举协议 - 自我和自我以及一个变量
- c# - EF 嵌套/非嵌套上下文处理和解决方案
- php - 命令到处理程序以在 DDD 和 CQRS 中聚合根到存储库流
- python - PulpSolverError: Pulp: 执行 C:\Users\ipeki\anaconda3\lib\site-packages\pulp\apis\..\solverdir\cbc\win\64\cbc.exe 时出错
- git - 在提交更改时出现以下错误
- java - 从智能合约交易中获取解码输出
- c# - 使用该方法开发 C# 代码。开发一个单元测试以验证该方法是否有效
- javascript - 如何将具有多个值的对象添加到数组中?
- vue.js - Vue JS:注销后执行 router.push() 方法时,表单没有被清除
- r - 为什么我用 chromoqc 看不到我的变体?