mariadb 查询和使用邮递员的不同输出

Posted

技术标签:

【中文标题】mariadb 查询和使用邮递员的不同输出【英文标题】:Different output from mariadb query and using postman 【发布时间】:2021-10-05 14:55:30 【问题描述】:

您好,我有一个查询要从数据库返回一个 JSON 值到后端。当我直接从数据库(phpmyadmin)查询它时,它工作正常并且查询返回正确的值。但是当我使用邮递员访问它时,它返回不同的值(它返回 null)

这是来自 phpmyadmin 的查询结果


"name": "Desi Ratnaningsih", 
"day": "Monday", 
"schedule": 
    [
        "start": "10:00:00", "end": "13:00:00",
        "start": "17:00:00", "end": "20:00:00"
    ]

这是邮递员的结果


    "name": "Desi Ratnaningsih",
    "day": "Monday",
    "schedule": null

这是我的查询

SELECT DISTINCT JSON_OBJECT( 
'name', d.name, 
'day', s.day, 
'schedule', JSON_EXTRACT(( 
           SELECT CONCAT('[', GROUP_CONCAT( JSON_OBJECT( 'start', h.start, 'end', h.end )) ,']') 
           FROM hours h JOIN schedules s ON h.id = s.working_hour 
           JOIN doctors d ON s.doctor_id = d.doctor_id WHERE d.doctor_id =1 AND s.day="Monday"),'$') ) AS data 
FROM doctors d JOIN schedules s ON d.doctor_id=s.doctor_id 
JOIN hours h on s.working_hour = h.id 
WHERE d.doctor_id = 1 AND s.day="Monday";

【问题讨论】:

看起来你应该使用GROUP BY d.docker_id而不是DISTINCT,应该使用JSON_ARRAYAGG而不是GROUP_CONCAT,这样你应该能够得到一个查询(没有子查询)。为什么 postman 不同可能是更严格的 SQL 模式,但修复查询,两者都应该很高兴。 【参考方案1】:

这更简单/正确吗?

SELECT JSON_OBJECT( 
'name', d.name, 
'day', s.day, 
'schedule', JSON_ARRAYAGG( JSON_OBJECT( 'start', h.start, 'end', h.end )) 
) AS data 
FROM doctors d
JOIN schedules s ON d.doctor_id=s.doctor_id 
JOIN hours h on s.working_hour = h.id 
WHERE d.doctor_id = 1 AND s.day="Monday"
GROUP BY d.docker_id, s.day;

这需要 MariaDB-10.5。

对于早期版本,GROUP_CONCAT 方法是:

SELECT JSON_OBJECT( 
'name', d.name, 
'day', s.day, 
'schedule', CONCAT('[', GROUP_CONCAT( JSON_OBJECT( 'start', h.start, 'end', h.end ) ) ,']') 
) AS data 
FROM doctors d
JOIN schedules s ON d.doctor_id=s.doctor_id 
JOIN hours h on s.working_hour = h.id 
WHERE d.doctor_id = 1 AND s.day="Monday"
GROUP BY d.docker_id, s.day;

【讨论】:

谢谢,不过MariaDB好像不支持JSON_ARRAYAGG函数 从 10.5.0 开始。

以上是关于mariadb 查询和使用邮递员的不同输出的主要内容,如果未能解决你的问题,请参考以下文章

linux如何安装数据和简单使用mysql-mariadb

DB::select 的输出与 phpMyAdmin 中的原始查询不同

ECS——CentOS7下使用yum安装MariaDB

JDBC与数据库连接,查询

SqlLite 和 MariaDb SELECT 之间的结果不同

CentOS 7.0 使用 yum 安装 MariaDB 与 MariaDB 的简单配置