MySQL查询的问题

时间:2014-06-06 12:51:50

标签: php mysql sql

我有两张桌子'评论'和'公司'

// **** ****公司 //

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  |

我希望它足够清楚,我只是想学习一些复杂的查询

2 个答案:

答案 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,但数据库不知道要采用哪一个 - 来自reviewscompany

答案 1 :(得分:1)

由于您使用的是COUNTAVG等汇总运算符,因此您必须按company.idcompany.namecompany.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