list包含nonaggregated列

时间:2017-09-04 19:14:49

标签: sql join aggregate

我有两个看起来像这样的表:

PetscLogEventEndDefault()

我希望拥有一个用户列表,其中包含所有属性以及每个用户拥有的产品数量。我尝试了以下方法:

users:
    id int unsigned auto_increment,
    primary key(id),
    [...]

product:
    id int unsigned auto_increment,
    seller id int unsigned auto_increment,
    primary key(id),
    foreign key(seller) references users(id)
    [...]

然而,这给了我以下错误:

select u.id, [...], count(p.id) from users u, products p where p.seller=u.id and [...]

完成所需结果的正确方法是什么?为什么这不起作用?

5 个答案:

答案 0 :(得分:1)

相关子查询可能是最简单的方法:

select u.*,
       (select count(*) from products p where p.seller = u.id) as num_products
from users u;

答案 1 :(得分:1)

您正在汇总数据(count(p.id))。您没有使用GROUP BY来获取每个组的聚合,因此您只获得一个包含聚合的结果行。

但您也选择u.id。哪一个?表中有许多不同的u.id,但您只能得到一个结果行。 DBMS希望您告诉它您想要哪一个,例如MAX(u.id)

如果要选择用户数据,请从users中选择。如果要获取产品数量,请在子查询中选择它们(最容易在select子句中完成,但也可以在from子句中完成)。

select
  u.*,
  (select count(*) from product p where p.seller = u.id) as number_of_products
from users u;

答案 2 :(得分:0)

使用LEFT JOINGROUP BY获取所需的结果。此外,user的所有属性都必须属于GROUP BY clausula。

SELECT u.id,  [...], count(p.id) from users u
LEFT JOIN products p where p.seller=u.id
GROUP BY u.id, [...]

错误表示如果您没有SELECT clausula,则无法在GROUP BY后面混合聚合函数和属性。

答案 3 :(得分:0)

以下是您可以尝试的正确查询:

<强> ASCII

SELECT u.id, [...], COUNT(p.id) FROM users u JOIN products p ON u.id=p.seller GROUP BY p.seller;

<强>非ASCII

SELECT u.id, [...], COUNT(p.id) FROM users u, products p WHERE u.id=p.seller GROUP BY p.seller;

答案 4 :(得分:0)

ANY_VALUE用于非聚合列。在您的示例中,非聚合列为db.u.id(请参见错误消息)。因此,您应该使用:

select ANY_VALUE(u.id), [...], count(p.id) 
from users u, products p 
where p.seller=u.id and [...]
group by [...]

更多详细信息here