MySQL查询以获取表2中所有者的总项目编号



我得到了两个表:所有者和存储如下:

表:所有者

id  |   owner    |  box
----------------------------
1   |   Nick     |  []
2   |   Jack     |  []
3   |   Jane     |  []

表:存储

id  |  fruit  | owner_id
---------------------------
1   |  Apple  |   1
2   |  Apple  |   3
3   |  Banana |   2
4   |  Banana |   1
5   |  Banana |   1
6   |  orange |   1
7   |  Apple  |   3
8   |  Orange |   2
9   |  Apple  |   2

问题:是否有查询结果中每个主人的盒子里有多少水果喜欢:

Nick:[Apple:1,Banan:2,Orange:1]
Jack:[Apple:1,Banan:1,Orange:1]
Jane:[Apple:2,Banan:0,Orange:0]

我试图连接两个表,但它返回了数百条重复的记录。如果有人能带我出去,我将不胜感激。

SELECT owners.id, 
JSON_OBJECTAGG(fruits.fruit, COALESCE(boxes.cnt, 0)) boxes
FROM (SELECT DISTINCT fruit
FROM Storage) fruits
CROSS JOIN owners
LEFT JOIN (SELECT owners.id, Storage.fruit, COUNT(*) cnt
FROM owners
JOIN Storage ON owners.id = Storage.owner_id
GROUP BY owners.id, Storage.fruit) boxes ON owners.id = boxes.id
AND fruits.fruit = boxes.fruit
GROUP BY owners.id;

小提琴

SELECT owner, GROUP_CONCAT(CONCAT('(', fruit,',',c,')') SEPARATOR ';') as counts
FROM 
(SELECT owner, owner_id, fruit, COUNT(*) as c FROM `storage` 
JOIN owners ON owners.id = storage.owner_id
GROUP BY fruit, owner_id) as t 
GROUP BY owner_id

这里的关键是括号中的请求

SELECT owner_id, fruit, COUNT(*) as c FROM `storage` GROUP BY fruit, owner_id

它提供了类似的东西

owner_id | fruit  | c
---------------------
1        | apple  | 1
1        | banana | 2
1        | orange | 1

你只需要用水果和c柱进行组concat

相关内容

最新更新