PHP / MySQL - Join / Union两个表的结果

时间:2013-07-06 01:54:21

标签: php mysql join union

这是我关于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”

我已经研究过工会和加入,但到目前为止,我找不到一种方法来输出我名单中所有公司的名称和总数。

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

2 个答案:

答案 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条评论的公司将会以一个好的评论击败一家公司......