我收到此消息column "mi.*" must appear in the GROUP BY clause or be used in an aggregate function
这意味着什么?以及如何解决?
我尝试将GROUP BY m.id
更改为GROUP BY m.id, mi.media_id
仍为同一错误
如果我删除它GROUP BY m.id ORDER BY COUNT(mua.id)
数据结构
[ { id: 54,
media_information: {
id: 1,
media_id: 54
}
},
]
查询
SELECT
m.*,
row_to_json(mi.*) as media_information
FROM media m
LEFT JOIN media_information mi ON mi.media_id = m.id
LEFT JOIN media_user_action mua ON mua.media_id = m.id
GROUP BY m.id
ORDER BY COUNT(mua.id)
...
表
media
id | ...
1
media_information
id | media_id fk media.id | ...
1 | 1
media_user_action
id | media_id fk media.id | user_id
1 | 1 | 1
2 | 1 | 3
更新基于下面的anser
Select m2.*
From media m2
LEFT JOIN media_user_action mua ON mua.media_id = m2.id
Where m2.id in (
SELECT
m.*,
row_to_json(mi.*) as media_information
FROM media m
LEFT JOIN media_information mi ON mi.media_id = m.id
)
GROUP BY m2.id
ORDER BY COUNT(mua.id)
答案 0 :(得分:1)
select列中的所有非聚合列都必须位于group by子句中。所以,既然你正在做m。*你必须把每一列放在
组中如果您想要表中的每一列,您应该将当前查询转换为子查询,如下所示:
Select m2.*
From media m2
Where m2.id in (subselect)
那么你必须将每个非聚合列放入组中的原因是什么?歧义
考虑一下。你有一张桌子上的名字和生日。您希望按生日分组以获得计数
Select name, birthday, count(birthday)
From thetable
Group by birthday
那么当多个人都在同一天出生时,db应该在名称列中返回什么?
编辑。实际阅读完查询后,我认为您正试图了解
Select m.*, row_to_json(mi.*) as media_information, (select count(*) from media_user_action mua where mua.media_id = m.id ) mua_count
From media m
LEFT JOIN media_information mi ON mi.media_id = m.id
ORDER BY mua_count
答案 1 :(得分:1)
在subselect中进行分组。我没有你的结构 - 所以也许它不会起作用 - 所以请把它作为样本:
SELECT
m.*,
row_to_json(mi.*) as media_information
FROM media m
JOIN media_information mi ON mi.media_id = m.id
JOIN media_user_action mua ON mua.media_id = m.id
JOIN (
SELECT
m.id, count(mua.id) as cnt
FROM media m
JOIN media_information mi ON mi.media_id = m.id
JOIN media_user_action mua ON mua.media_id = m.id
GROUP BY m.id) as counts on m.id = counts.id
ORDER BY counts.cnt
答案 2 :(得分:1)
您可以先进行分组,然后再进行
等连接SELECT
m.*,
row_to_json(mi.*) as media_information
FROM media m
LEFT JOIN media_information mi ON mi.media_id = m.id
LEFT JOIN (select media_id, COUNT(id) as mua_count
from media_user_action
group by media_id) xxx ON xxx.media_id = m.id
ORDER BY xxx.mua_count;