2017-09-04 95 views
1

我有一个看起来像这两个表:列表包含非聚合列

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 [...] 

然而这使我有以下错误:

ERROR 1140 (42000): In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'db.u.id'; this is incompatible with sql_mode=only_full_group_by 

什么是实现想要的结果的正确方法?为什么这不起作用?

+0

好吧,通过使用select id作为用户ID(来自id = userid的产品的select count(id)),相对较快地解决了我的第一个问题。我仍然不明白这个错误。 – Addi

+0

错误提到了一组。发帖实际查询你已经试过 – Horaciux

+0

你正在使用哪个dbms? –

回答

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; 
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属性,如果你没有GROUP BY克劳苏拉。

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; 
0

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

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