Laravel中如何从多行数据获取合并后的用户票据数组?
解决方案
1. SQL查询语句(MySQL 8.0+)
如果tickets字段是JSON数组类型(单条投注记录的tickets格式类似[283983, 389239]),可通过以下SQL获取指定日期下各用户的所有票据:
SELECT b.user_id, JSON_ARRAYAGG(t.ticket) AS user_tickets FROM bets b JOIN JSON_TABLE( b.tickets, '$[*]' COLUMNS(ticket INT PATH '$') ) t WHERE b.draw_date = '2024-05-20' -- 替换为目标查询日期 GROUP BY b.user_id;
2. 逻辑说明
JSON_TABLE:将每条投注记录中的ticketsJSON数组拆分为单行数据,每个票据元素独立成列GROUP BY user_id:按用户ID分组,聚合同一用户的所有票据记录JSON_ARRAYAGG:把同一用户的所有票据元素重新合并为一个JSON数组
3. 应用层转换为目标格式
查询返回的是user_id与对应票据数组的映射关系,可在应用代码中转为以用户ID为键的关联数组,以PHP为例:
// 假设已建立PDO数据库连接 $targetDate = '2024-05-20'; $stmt = $pdo->prepare("SELECT user_id, JSON_ARRAYAGG(t.ticket) AS user_tickets FROM bets b JOIN JSON_TABLE(b.tickets, '$[*]' COLUMNS(ticket INT PATH '$')) t WHERE b.draw_date = ? GROUP BY b.user_id"); $stmt->execute([$targetDate]); $finalResult = []; while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $finalResult[$row['user_id']] = json_decode($row['user_tickets'], true); } // 输出即为你需要的格式 print_r($finalResult);
内容的提问来源于stack exchange,提问作者Naung Ye Htet
相关产品推荐
相关产品推荐

