我有两张桌子'评论'和'公司'
// **** ****公司 //
id | name | others |
1 | company 1 | dhvhvbd|
2 | company 2 | didhhdi|
3 | company 3 | fyfyufu|
4 | company 4 | hdihdhi|
// *** ****评论 //
id | company_id | rate |
1 | 1 | 3 |
2 | 3 | 5 |
3 | 1 | 4 |
我正在尝试编写这样的SQL查询(不正确,但你应该知道我想要的是什么)
$query = "
SELECT c.id
, c.name
, c.others
, AVG(r.rate) rate
, COUNT(*) count
FROM company c
LEFT
JOIN reviews r
ON r.company_id = c.id
GROUP
BY c.id;
";
这可能看起来很混乱,但这就是我想要的:显示所有这些上市公司(无论他们是否在评论表中有评论),也获得每个公司的'reviews.rate'的平均值(因为他们将对一家公司进行一次以上的审核)并获得该公司出现的评论次数。
示例:
显示
id | name | others | rate | count |
1 | company 1| dhvhvbd| 3.5 | 2 |
2 | company 2| didhhdi| NULL | NULL |
3 | company 3| fyfyufu| 5 | 1 |
4 | company 4| hdihdhi| NULL | NULl |
我希望它足够清楚,我只是想学习一些复杂的查询
答案 0 :(得分:1)
您需要将所有列添加到不会通过函数聚合的group by
子句中
SELECT company.id, company.name, company.others,
AVG(reviews.rate) AS rate,
COUNT(reviews.id) AS `count`
FROM company
LEFT JOIN reviews ON company.id = reviews.company_id
GROUP BY company.id, company.name, company.others
如果你有2个具有相同列名的表,那么你也需要为表命名。您在查询中使用了group by id
,但数据库不知道要采用哪一个 - 来自reviews
或company
。
答案 1 :(得分:1)
由于您使用的是COUNT
和AVG
等汇总运算符,因此您必须按company.id
,company.name
和company.others
对所有记录进行分组(所有SELECT
子句中包含的列。因此,您的查询将无法正常工作。
此外,使用GROUP BY id
您的MySQL引擎会抱怨,因为实际上列id
不明确,因为LEFT JOIN
中涉及的两个表都有一个id
列,引擎不知道你的意思是哪一列。
使用以下查询:
SELECT company.id, company.name, company.others,
AVG(reviews.rate) AS rate,
(CASE WHEN COUNT(reviews.id) = 0 THEN NULL ELSE COUNT(reviews.id) END) AS `count`
FROM Company
LEFT JOIN Reviews ON company.id = reviews.company_id
GROUP BY company.id, company.name, company.others
请参阅SQL小提琴here。