I have 3 tables
Restaurants table:
restaurant_id | restaurant_name |
---|---|
1 | Burger King |
2 | Coffee shop |
Foods table:
food_id | food_title | category_id | restaurant_id |
---|---|---|---|
1 | Burger with cheese | 1 | 1 |
2 | Beef Burger | 2 | 1 |
3 | Beef Burger with cheese | 2 | 1 |
4 | Iced Coffee | 3 | 2 |
5 | Dark Coffee | 3 | 2 |
5 | Green Tea | 4 | 2 |
Categories table:
category_id | category_title |
---|---|
1 | Normal Burger |
2 | Beef Burger |
3 | Coffee |
4 | Tea |
The output I'm looking for:
restaurant_id | restaurant_name | categories_list |
---|---|---|
1 | Burger King | [{category_id: 1, category_title: 'Normal Burger'}, {category_id: 2, category_title: 'Beef Burger'}] |
2 | Coffee shop | [{category_id: 3, category_title: 'Coffee'}, {category_id: 4, category_title: 'Tea'}] |
CodePudding user response:
Try:
select restaurant_id,restaurant_name,concat('[',group_concat(my_col),']') as tot_result
from ( select r.restaurant_id,r.restaurant_name,concat('{category_id: ', c.category_id," category_title: '",c.category_title ,"'}") as my_col
from Restaurants r
inner join Foods f on r.restaurant_id=f.restaurant_id
inner join Categories c on c.category_id=f.category_id
group by r.restaurant_id,r.restaurant_name,my_col
) as t1
group by restaurant_id,restaurant_name;
Result:
restaurant_id restaurant_name tot_result
1 Burger King [{category_id: 1 category_title: 'Normal Burger'},{category_id: 2 category_title: 'Beef Burger'}]
2 Coffee shop [{category_id: 3 category_title: 'Coffee'},{category_id: 4 category_title: 'Tea'}]
CodePudding user response:
Join Restaurants
to Foods
and Categories
with LEFT
joins and group by restaurant.
Then use JSON_ARRAYAGG()
aggregate function to get the lists:
SELECT r.restaurant_id, r.restaurant_name,
JSON_ARRAYAGG(JSON_OBJECT('category_id', c.category_id, 'category_title', c.category_title)) categories_list
FROM Restaurants r
LEFT JOIN (SELECT DISTINCT category_id, restaurant_id FROM Foods) f ON f.restaurant_id = r.restaurant_id
LEFT JOIN Categories c ON c.category_id = f.category_id
GROUP BY r.restaurant_id, r.restaurant_name;
I use SELECT DISTINCT ...
in the table Foods
because I see in your expected results that you want distinct categories in each list.
See the demo.