I am trying to run below query in mysql workbench, it gives correct output.
SELECT Employee.Lname, Employee.Fname, Department.Dname,
(SELECT CONCAT('[', GROUP_CONCAT(CONCAT(
'{"PNAME":"', Project.Pname, '"',
'"PNUMBER":"', Project.Pnumber, '"',
',"HOURS":"', Works_on.Hours, '"}')),']') as 'json'
FROM Works_on
INNER JOIN Project ON Project.Pnumber = Works_on.Pno WHERE Employee.Ssn = Works_on.Essn) AS Projects
FROM Employee
JOIN Department ON Department.Dnumber = Employee.Dno
WHERE Department.Dnumber = Employee.Dno;
This is the output.
But when i put it as a string, the dynamic parameters in the subquery as passed as a static(string) which leads to the wrong output.
query = "SELECT Employee.Lname, Employee.Fname, Department.Dname, (SELECT CONCAT('[', GROUP_CONCAT(CONCAT('{\"PNAME\":"', Project.Pname, '"','\"PNUMBER\":"', Project.Pnumber, '"',',\"HOURS\":"', Works_on.Hours, '"}')),']') as 'json' FROM Works_on INNER JOIN Project ON Project.Pnumber = Works_on.Pno WHERE Employee.Ssn = Works_on.Essn) AS Projects FROM Employee JOIN Department ON Department.Dnumber = Employee.Dno WHERE Department.Dnumber = Employee.Dno;"
I printed the query in the console, it's like this -
SELECT Employee.Lname, Employee.Fname, Department.Dname, (SELECT CONCAT('[', GROUP_CONCAT(CONCAT('{"PNAME":, Project.Pname, ','"PNUMBER":, Project.Pnumber, ',',"HOURS":, Works_on.Hours, }')),']') as 'json' FROM Works_on INNER JOIN Project ON Project.Pnumber = Works_on.Pno WHERE Employee.Ssn = Works_on.Essn) AS Projects FROM Employee JOIN Department ON Department.Dnumber = Employee.Dno WHERE Department.Dnumber = Employee.Dno;
this is output on executing the above query in python.
Edit - @Barmar solution helped me to get the correct records but while converting it to xml, dictionaries are not converting into xml tags.
current output is -
Edit2 - @Barmar solution gives output like this -
Here I want to store like below (without quotes)-
I am fetching this document & storing it as .json file then converting that json file to xml I am looking to get the nested xml tags for projects tag.
Could anyone help me to resolve this ?
Thanks, Jay
1 Answer 1
You're missing the backslash before some of the " in the Python version. It would be easier if you used triple quotes around the whole SQL string, then you wouldn't need to escape quotes inside it.
But even easier would be to use the built-in JSON functions to create the JSON array of objects, rather than concatenating strings.
SELECT Employee.Lname, Employee.Fname, Department.Dname,
(SELECT JSON_ARRAYAGG(JSON_OBJECT('PNAME', Project.Pname, 'PNUMBER', Project.Pnumber, 'HOURS', Works_On.Hours)) as 'json'
FROM Works_on
INNER JOIN Project ON Project.Pnumber = Works_on.Pno WHERE Employee.Ssn = Works_on.Essn) AS Projects
FROM Employee
JOIN Department ON Department.Dnumber = Employee.Dno
You also don't have to specify the joining relationship in both ON and WHERE.
9 Comments
Function JSON_ARRAY__AGG does not exist. :(JSON_ARRAYAGG
JSON_ARRAY_AGGandJSON_OBJECTinstead of constructing JSON by hand."are not quoted..."after:json_objectorjson_array_agg.