mysql - 基于多列删除/合并行
问题描述
我有下表:
+------------+-----------+--------+----------+-------------+------------------+
| id | order_id | origin | type | delivery_id | return_requested |
+------------+-----------+--------+----------+-------------+------------------+
| 42 | 420 | US | DELIVERY | d-UUID | 0 |
+------------+-----------+--------+----------+-------------+------------------+
| 43 | 420 | US | RETURN | r-UUID | 1 |
+------------+-----------+--------+----------+-------------+------------------+
| 48 | 520 | US | DELIVERY | d-UUID | 0 |
+------------+-----------+--------+----------+-------------+------------------+
| 50 | 520 | US | RETURN | r-UUID | 1 |
+------------+-----------+--------+----------+-------------+------------------+
其中d-UUID
或是r-UUID
带有前缀的唯一 ID(d
用于交付和r
返回)。
目前我改变了在数据库中插入数据的方式,而不是每次都添加一个新行,我现在正在查找 order_id 并更新现有行。
例如,如果订单被退回,我现在将找到 id=42 的订单,并将其从类型“DELIVERY”更新为“RETURN”,并将“return_requested”从 false 更新为 true,同时delivery_id
保持不变。(两列 type 和 return_requested 有点多余,但那是另一天)
但是我现在有很多旧条目,我想从它们delivery_id
开始r-
删除/合并order_id
相同的行。
我有以下 SQL 可以找到这些行:
SELECT * FROM delivery
WHERE order_id IN (
SELECT order_id FROM delivery
WHERE return_requested = 1
AND delivery_id LIKE '%R-%'
)
但我不知道如何合并这些行。最后我想实现这个:
+------------+-----------+--------+----------+-------------+------------------+
| id | order_id | origin | type | delivery_id | return_requested |
+------------+-----------+--------+----------+-------------+------------------+
| 42 | 420 | US | RETURN | d-UUID | 1 |
+------------+-----------+--------+----------+-------------+------------------+
| 48 | 520 | US | RETURN | d-UUID | 1 |
+------------+-----------+--------+----------+-------------+------------------+
编辑:我正在寻找一个更新/删除语句来改变数据库中的数据,而不是一个 SELECT 语句。
解决方案
假设不是所有的订单都有退货,你需要一个左连接来获得你想要的输出:
SELECT
o.id,
o.order_id,
o.origin,
CASE WHEN r.id NULL THEN o.type ELSE r.type END AS type,
o.delivery_id,
CASE WHEN r.id NULL THEN 0 ELSE 1 END AS return_requested,
FROM delivery as o
LEFT JOIN delivery as r
ON RIGHT(o.delivery_id, len(o.delivery_id)-2) = RIGHT(r.delivery_id, len(r.delivery_id)-2)
要“合并”记录,您可以这样做:
UPDATE o
SET
o.type = 'RETURN'
o.return_requested = 1
from delivery as o
INNER JOIN delivery as r
ON RIGHT(o.delivery_id, len(o.delivery_id)-2) = RIGHT(r.delivery_id, len(r.delivery_id)-2)
DELETE FROM delivery
WHERE LEFT(delivery_id, 2) = 'r-'
推荐阅读
- python - PyShark 和 TShark 数据包计数之间的差异
- rust - 什么是 rmeta 文件以及如何查看其内容?
- django - 如何使用`obj.get_absolute_url'在django模板中构建对象的完整url?
- javascript - 如何在 PHP 中读取动态 html 输入变量
- python - 从json文件python3中提取数据
- c - 比较浮点变量和无符号整数时的意外结果
- c++ - 来自原始字节的 Wic 位图
- javascript - 使用 getElementsByClassName 将多个值更改为字符串
- android - Proguard - 使用 findViewById 在 FloatingActionButton 上获取 NullPointerException
- ios - 如何检查数组是否包含空值并快速给出默认值