select row_to_json table,error:必须出现在GROUP BY子句中或用于聚合函数

时间:2016-04-29 06:16:57

标签: sql postgresql

我收到此消息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)

3 个答案:

答案 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;