2013-07-06 62 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條差評的公司會以一個很好的評論來擊敗一家公司......