1

Am Trying to create a json array by leveraging info three database tables.

After leveraging info and solution found here source I came to realize how application performance can be improved using just one queries via Mysql Concat and Group_Concat Method.

The three tables is created as follows each with their reference keys

Create table categorys(id int primary key auto_increment, category_name varchar(30), buyer_userid int(30));

Create table product(id int primary key auto_increment, product_name varchar(30), buyer_userid int(30),category_id int,
foreign key (category_id) references categorys(id));


Create table sales(items_id int primary key auto_increment, item_name varchar(30),quantity varchar(30), buyer_userid int(30),
product_id int, foreign key (product_id) references product(id));

Here is my expected Json Format...

[
{"id":"1","cat_name":"Provision","catbuy_userid":"100",
"products_info":[{"productid":"2","product_name":"Malt","buyer_userid":"100",
"sales_Info":[{"items_id":"1","item_name":"malt","buyer_userid":"100","quantity":"72"}]
}]},
{"id":"2","cat_name":"Cosmetics","catbuy_userid":"200",
"products_info":[{"productid":"3","product_name":"soapy","buyer_userid":"200",
"sales_Info":[{"items_id":"2","item_name":"cream","buyer_userid":"200","quantity":"83"}]
}]}
]

My success and issues so Far.

I was able to get json records for the first and second table(Category and Product table respectively).

When I tried to get that of third table(Sales) with GROUP_CONCAT(CONCAT()) method it displays error Invalid use of group function

Here is the implementation so far.

 SELECT 
     CONCAT(
       "{"
     ,     '"id"' , ":" , '"' , categorys.id , '"' , ","
     ,     '"name"' , ":" , '"' , categorys.category_name , '"' , ","
     ,     '"productInfo"' , ":" , "["
                              ,GROUP_CONCAT(CONCAT(
"{"
     ,     '"pid"' , ":" , '"' , product.id , '"' , ","
     ,     '"productname"' , ":" , '"' , product.product_name , '"' , ","


     ,     '"SalesInfo"' , ":" , "["
                              , GROUP_CONCAT(CONCAT(
"{"
     ,     '"sales id"' , ":" , '"' , sales.items_id , '"' , ","
     ,     '"item name"' , ":" , '"' , sales.item_name , '"' , ","

  , "}"
))
                          , "]"



  , "}"
))
                          , "]"
     , "}"
     ) AS json 
  FROM 
   categorys 
  INNER JOIN 
    product 
  ON 
    categorys.id = product.category_id
  INNER JOIN
    sales 
  ON
    product.id = sales.product_id
  WHERE 
    categorys.id IN(SELECT id FROM categorys)
  GROUP BY
     categorys.id

1 Answer 1

1

You can't nest grouping functions like GROUP_CONCAT. Instead, you will need to create the product and sales JSON inside a subquery and then include that into your top-level JSON. Without sample data it's hard to be certain, but something like this should work:

 SELECT 
     CONCAT(
       "{"
     ,     '"id"' , ":" , '"' , categorys.id , '"' , ","
     ,     '"name"' , ":" , '"' , categorys.category_name , '"' , ","
     ,     '"productInfo"' , ":" , "["
                              ,GROUP_CONCAT(product_sales)
                          , "]"
     , "}"
     ) AS json 
  FROM 
   categorys 
  INNER JOIN (SELECT CONCAT(
"{"
     ,     '"pid"' , ":" , '"' , product.id , '"' , ","
     ,     '"productname"' , ":" , '"' , product.product_name , '"' , ","


     ,     '"SalesInfo"' , ":" , "["
                              , GROUP_CONCAT(CONCAT(
"{"
     ,     '"sales id"' , ":" , '"' , sales.items_id , '"' , ","
     ,     '"item name"' , ":" , '"' , sales.item_name , '"' , ","

  , "}"
))
                          , "]"



  , "}"
) AS product_sales
             FROM product 
  INNER JOIN
    sales 
  ON
    product.id = sales.product_id) p
  ON 
    categorys.id = p.category_id
  WHERE 
    categorys.id IN(SELECT id FROM categorys)
  GROUP BY
     categorys.id
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.