这是我关于Stack Overflow的第一篇文章,所以我会尽量提供尽可能多的信息。我花了好几个小时试图解决这个问题,并认为可能有一些帮助可以帮助我解决这个问题。
我正在尝试使用Mysql 5 / Php5创建一个评论网站,我有两个表:
公司'
'的评论
在公司表格中,我列出了所有美国公司的完整列表,在评论表格中,我列出了基于以下公司的评论: 公司“表格。当用户通过表单提交评论时,会填充评论表。
因此,我希望有一个搜索结果页面,它将按字母顺序列出所有公司。在搜索结果的表格中,将列出公司名称,总评论和总分。
在公司表中,我有以下列:
的 COMPANY_ID
公司
解决
城市
状态
在评论表格中,我有以下列:
的 'REVIEW_ID'
'review_date'
“公司”
“审核”
'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)作为ItemSum,COUNT(公司)作为TotalReviews来自评论公司LIKE“'。$ letter。'%”GROUP BY 公司;');
所以,输出就是这样:
“百思买”“35”“3”
问题是,此查询仅输出并计算实际在评论表中进行审核的公司。我的目标是将结果与“公司”表结合起来,这样那些没有评论的公司仍然会在表格的输出列表中显示“ ItemSum ”为> 0 ,计数为 0 。
“ABC公司”“0”“0”
“百思买”“35”“3”
我已经研究过工会和加入,但到目前为止,我找不到一种方法来输出我名单中所有公司的名称和总数。
如果有人对此有任何指示,我将非常感谢任何建议。
答案 0 :(得分:1)
使用LEFT JOIN公司查询COUNT:
e.g。
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)组合在一起。当然,'%...%'就是例如:)
答案 1 :(得分:1)
1。)您应该将评论表中的“公司”列更改为公司表上company_id的foriegn密钥。它现在似乎只是名字。这将促进连接,并允许约束。
2。)你可能想要一个LEFT OUTER JOIN,它将为你提供第一张表中的所有行(在这种情况下是公司)
<击>
SELECT *
来自公司c
LEFT OUTER JOIN评论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条评论的公司将会以一个好的评论击败一家公司......