2

这是我在 Stack Overflow 上的第一篇文章,所以我会尽量提供尽可能多的信息。我花了几个小时试图弄清楚这一点,并认为也许一些帮助会让我克服这个项目的困难。

我正在尝试使用 Mysql 5/Php5 创建一个评论网站,我有两个表:

'公司'
'评论'

公司表中,我有所有美国公司的完整列表,在评论表中,我有一个基于“公司”表中公司的评论列表。当用户通过表单提交评论时,会填充评论表。

因此,我想要一个搜索结果页面,它将按字母列出所有公司。在搜索结果表中,将列出公司名称、总评论和总分。

公司表中,我有以下列:
company_id
公司
地址
城市

评论下列
'
review_id''review_date''company''review''review_city''review_state''comp_benefits''work_life_balance''job_security''career_growth
'







目前,我编写了一个 SQL 脚本,它输出“评论”表中的所有公司、它的分数和总评论数的总和:

$result = mysql_query('select *, SUM(comp_benefits + work_life_balance + job_security + career_growth) as ItemSum, COUNT(company) as TotalReviews from reviews where company LIKE "'.$letter.'%" GROUP BY company;');

因此,输出将是这样的:

“百思买”“35”“3”

问题是,这个查询只输出和计算评论表中实际有评论的公司。我的目标是将结果与“公司”表结合起来,这样没有评论的公司仍会出现在表的输出列表中,“ItemSum”为“ 0 ”,“ ItemSum ”为“0” 0 ' 表示计数

“ABC 公司”“0”“0”
“百思买”“35”“3”

我研究了工会和加入,但到目前为止,我找不到一种方法来输出我列表中的所有公司,按不同的名称和总数。

如果有人对此有任何指导,我将非常感谢任何建议。

4

2 回答 2

1

使用带有 LEFT JOIN 的公司查询来查询 COUNT:

例如

SELECT c.*, COALESCE(x.cnt, 0) 
FROM companies c 
   LEFT JOIN 
   ( 
       SELECT company, COUNT(*) AS cnt 
       FROM reviews 
       GROUP BY company 
   ) x ON x.company = c.company_id 
WHERE c.company LIKE '%...%'

使用 LEFT JOIN,您可以将左(第一个)表(此处为公司)中的所有记录与第二个表(此处为 x)中的记录结合起来。当然 '%...%' 例如 :)

于 2013-07-06T02:05:38.557 回答
1

1.)您应该将评论表上的“公司”列更改为公司表上 company_id 的外键。它现在似乎只是按名称。这将促进连接,并允许约束。

2.)您可能想要一个左外连接,它将为您提供第一个表中的所有行(在本例中为公司)

SELECT *
FROM Companies c
左外连接评论 r
ON c.company_id = r.company_id

编辑:Vassilen 的加入是正确的,不是我的。您需要先汇总评论行,而不是逐行匹配。

SELECT c.company, COALESCE(r.total_score,0) as total_score, r.count
FROM Companies c
LEFT OUTER JOIN
( 
    SELECT company_id, SUM(comp_benefits + work_life_balance + job_security + career_growth) as total_score, COUNT(*) as count
    FROM reviews 
    GROUP BY company
) r
ON r.company_id = c.company_id 

3.) 你希望总分是所有评论的总和吗?当我读到它时,一家拥有 100 条差评的公司会击败一家拥有一条好评的公司……

于 2013-07-06T02:06:12.320 回答