2013-07-06 47 views
2

这是我在Stack Overflow上的第一篇文章,所以我会尽量提供尽可能多的信息。我花了好几个小时试图弄清楚这一点,并认为可能有些帮助会让我对这个项目感兴趣。PHP/MySQL - 加入/联盟两个表的结果

我试图创建使用MySQL 5 /一的php5评论网站和我有两个表:

'公司'
'评论'

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

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

公司表,我有以下栏目:
COMPANY_ID
公司
地址
城市
状态

评论表,我有以下列:
'rev iew_id”
'review_date'
'公司'
'审核'
'review_city'
'review_state'
'comp_benefits'
'work_life_balance'
'job_security'
'career_growth'

目前,我写了一个SQL脚本,输出所有公司的'评论 '表,它的一个总和的得分和总复习数:

$结果= mysql_query(' SELECT *,SUM(comp_benefits + work_life_balance + job_security + career_growth)作为ItemSum,COUNT(公司)作为TotalReviews从评论公司LIKE“'。$ letter。'%”GROUP BY company;');

所以,输出会是这样:

“百思买”,“35”,“3”

的问题是,这个查询只能输出,并计算实际在评论中公司评论:表。我的目标是将结果与'公司'表结合起来,以便那些没有审核的公司仍然出现在表格的输出列表中,''代表'ItemSum'和''为count

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

我已经研究工会和加入,但到目前为止,我无法找到一个方法来输出我名单上的所有公司都是按名称和总数统计的。

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

+0

我建议在一些交互式MySQL客户端上试验,而不是通过PHP。 –

回答

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)。当然,'%...%'是例如:)

+0

谢谢,这工作正如我需要它! – MBoyce84

1

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

2)你可能想要一个LEFT OUTER JOIN,这将给你所有的从第一个表中的行(在这种情况下公司)

SELECT *
FROM公司Ç
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条差评的公司会以一个很好的评论来击败一家公司......