2011-07-27 127 views
1

我有2個表(Wordpress數據庫),一個存儲帖子和其他帖子元。對於這個例子,帖子表存儲關於場地(即酒吧或俱樂部)的信息。元表正在存儲用戶/訪客給這些酒吧的評分。等級在'_rating'下被存儲爲20,40,60,80或100。我有以下查詢。MySQL左加入

SELECT posts.*, AVG(meta.meta_value) as average 
FROM wp_posts as posts 
LEFT JOIN wp_postmeta as meta 
    ON posts.ID = meta.post_ID 

WHERE meta.meta_key = '_rating' 
    AND posts.post_status = 'publish' 
    AND posts.post_type = 'npc_venue' 

GROUP BY meta.post_id 
ORDER BY post_title asc 

這工作很好,除了一個問題。如果場地尚未收到評分,則wp_postmeta表中沒有'_rating'條目,因此它不會被拉入查詢中。

問題是:即使他們尚未收到評分,我如何從數據庫中提取所有場地的平均評分。提前致謝!

編輯:如果場地有尚未分級,再有就是在wp_postmeta表中沒有_rating項,這帶來了問題,是什麼NULL意味着什麼? NULL通常用於未知值。但是,當條目完全從表中丟失時,是否仍然被認爲是NULL?或者它只是成爲一個空行集?

回答

1

meta.meta_key = '_rating'在連接條件,而不是在WHERE條款,即(未經測試):

SELECT posts.*, AVG(meta.meta_value) as average 
FROM wp_posts as posts 
LEFT JOIN wp_postmeta as meta 
    ON posts.ID = meta.post_ID 
    AND meta.meta_key = '_rating' 

WHERE posts.post_status = 'publish' 
    AND posts.post_type = 'npc_venue' 

GROUP BY posts.ID 
ORDER BY post_title asc 

還要注意GROUP BY子句中的變化;如果沒有匹配的元數據記錄,則meta.post_ID將爲NULL。

+0

謝謝!這是唯一的解決方案,如果沒有_rating鑰匙出席場地! – Chris

0

計算所有非額定場館可以使用ISNULL功能

SELECT posts.*, AVG(ISNULL(meta.meta_value, 0)) as average 
+0

這不起作用,因爲NULL值與不存在的條目不同。 – Chris

+0

如何描述不存在評分的條目?據我瞭解,如果沒有排名的場地,它的評級沒有設置,si是meta.meta_value沒有設置或..? – sll

+0

我已經編輯了我的初始答案,但仍然不確定是否只需要計算所有未評分的場地(當所有場都有0值時,計算它們是有意義的),或者只包括所有場地中的最終結果集 – sll

1

嘗試類似...

SELECT posts.*, 
    (SELECT AVG(meta.meta_value) 
     FROM wp_postmeta as meta 
     WHERE posts.ID = meta.post_ID 
      AND meta.meta_key = '_rating' 
      AND posts.post_status = 'publish' 
      AND posts.post_type = 'npc_venue) as average 
    ORDER BY post_title ASC 

...不知道這是否會過去一樣工作,但該想法在那裏......使「平均」計算字段而不是聯接。

+0

This實際上在調整時包括查詢中的所有組件。我正在測試一些較短的解決方案,看看它們現在是否能夠正常工作,但如果沒有,那麼您的解決方案就是贏家! – Chris

0

試試這個

SELECT posts.*, AVG(NULLIF(meta.meta_value,0)) as average 
+0

我喜歡這個選項,但它似乎不工作。請檢查我的帖子中的編輯。 – Chris