数据一
select pat.position_id position_id, pat.id audit_id
from (
select t.creator,
cast(
concat('[',
substring_index(
group_concat(concat('"', t.audit_id, '"') order by rand()),
',',
#{userSampleCount}
),
']') as json
) audit_ids
from (
select pat.position_id, max(pat.id) audit_id, pat.creator
from position_audit pat
where pat.creator > 1
and pat.entry in ('AUDITING', 'RECHECKING')
and pat.create_time between #{startDate} and date_add(#{endDate}, interval 86399 second)
and pat.creator in (
#{auditor}
)
and pat.finished = 1 and pat.id = pat.`group`
group by pat.position_id, pat.creator, date_format(pat.create_time, '%Y-%m-%d')
) t
inner join position pn on pn.id = t.position_id and pn.updater = t.creator and pn.source = 'USER'
group by t.creator
) t
inner join position_audit pat on pat.creator = t.creator
and json_contains(t.audit_ids, concat('"', pat.id, '"'))
union all
select pat.position_id position_id, pat.id audit_id
from (
select t.creator,
cast(
concat('[',
substring_index(
group_concat(concat('"', t.audit_id, '"') order by rand()),
',',
#{captureExactSampleCount}
),
']') as json
) audit_ids
from (
select pat.position_id, max(pat.id) audit_id, pat.creator
from position_audit pat
where pat.creator > 1
and pat.entry in ('AUDITING', 'RECHECKING')
and pat.create_time between #{startDate} and date_add(#{endDate}, interval 86399 second)
and pat.creator in (
#{auditor}
)
and pat.finished = 1 and pat.id = pat.`group`
group by pat.position_id, pat.creator, date_format(pat.create_time, '%Y-%m-%d')
) t
inner join position pn
on pn.id = t.position_id and pn.updater = t.creator and pn.source = 'CAPTURED' and `vague` = 0
group by t.creator
) t
inner join position_audit pat on pat.creator = t.creator
and json_contains(t.audit_ids, concat('"', pat.id, '"'))
union all
select pat.position_id position_id, pat.id audit_id
from (
select t.creator,
cast(
concat('[',
substring_index(
group_concat(concat('"', t.audit_id, '"') order by rand()),
',',
#{captureVagueSampleCount}
),
']') as json
) audit_ids
from (
select pat.position_id, max(pat.id) audit_id, pat.creator
from position_audit pat
where pat.creator > 1
and pat.entry in ('AUDITING', 'RECHECKING')
and pat.create_time between #{startDate} and date_add(#{endDate}, interval 86399 second)
and pat.creator in (
#{auditor}
)
and pat.finished = 1 and pat.id = pat.`group`
group by pat.position_id, pat.creator, date_format(pat.create_time, '%Y-%m-%d')
) t
inner join position pn
on pn.id = t.position_id and pn.updater = t.creator and pn.source = 'CAPTURED' and `vague` = 1
group by t.creator
) t
inner join position_audit pat on pat.creator = t.creator
and json_contains(t.audit_ids, concat('"', pat.id, '"'))
知识点
标签的使用
...
...
GROUP_CONCAT + ORDER BY RAND()
作用 :将多个值拼接成字符串,并按随机顺序排序。
示例 :
group_concat(concat('"', t.audit_id, '"') order by rand())
SUBSTRING_INDEX
substring_index(group_concat(...), ',', #{userSampleCount})
CAST(... AS JSON)
cast(concat('[', substring_index(...), ']') as json)
JSON_CONTAIN
作用 :检查 JSON 数组中是否包含某个值。
示例 :
json_contains(t.audit_ids, concat('"', pat.id, '"'))
JSON数据类型处理
函数
作用
示例场景
JSON_ARRAY()
创建 JSON 数组
初始化订单状态历史
JSON_ARRAY_APPEND()
向数组追加元素
添加新状态
JSON_LENGTH()
获取数组/对象长度
限制状态历史长度
JSON_MERGE_PATCH()
合并并覆盖重复键(对象)
更新物流信息
JSON_EXTRACT()
提取 JSON 中的值
查询最新状态
JSON_CONTAINS_PATH()
检查 JSON 中是否存在指定路径
验证物流信息是否存在
JSON_MERGE()
合并 JSON 文档(兼容旧版本)
合并用户备注(注意数组行为)
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
status_history JSON COMMENT '状态变更历史(JSON数组)',
extra_info JSON COMMENT '额外信息(JSON对象)'
);
-- JSON_ARRAY()、JSON_OBJECT
INSERT INTO orders (user_id, status_history, extra_info)
VALUES (
1001,
JSON_ARRAY('created'),
JSON_OBJECT('note', '请尽快发货')
);
-- JSON_ARRAY_APPEND:追加数据
UPDATE orders
SET status_history = JSON_ARRAY_APPEND(status_history, '$', 'ios')
WHERE order_id = 1;
-- JSON_MERGE_PATCH:追加数据
UPDATE orders
SET extra_info = JSON_MERGE_PATCH(
extra_info,
'{"logistics": {"company": "顺丰", "tracking_no": "SF123456"}}'
)
WHERE order_id = 1;
-- JSON_EXTRACT() 提取最后一个状态
SELECT
JSON_EXTRACT(status_history, '$[last]') AS last_status
FROM orders
WHERE order_id = 1;
-- JSON_CONTAINS_PATH() 验证extra_info中是否有物流信息
SELECT
JSON_CONTAINS_PATH(extra_info, 'one', '$.logistics') AS has_logistics
FROM orders
WHERE order_id = 1;
-- JSON_MERGE:会合并为数组
UPDATE orders
SET extra_info = JSON_MERGE(
extra_info,
'{"note": "已加急处理"}'
)
WHERE order_id = 1;
-- JSON_LENGTH()长度
SELECT * from orders where JSON_LENGTH(status_history)>2