我有两个看起来像这样的表:
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 [...]
完成所需结果的正确方法是什么?为什么这不起作用?
答案 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 JOIN
和GROUP 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。