MySQL Left Join

时间:2011-07-27 15:51:44

标签: mysql wordpress left-join

我有2个表(Wordpress数据库),一个存储帖子,另一个存储元数据。对于该示例,posts表存储关于场所(即酒吧或俱乐部)的信息。元表存储由用户/访客给予这些条的评级。评级在“_rating”键下存储为20,40,60,80或100。我有以下查询。

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吗?或者它只是变成空行集?

4 个答案:

答案 0 :(得分: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

...不确定这是否会按原样运作,但想法是......将“平均值”设为计算字段而不是连接。

答案 1 :(得分: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。

答案 2 :(得分:0)

要计算所有未评级的场地,您可以使用ISNULL功能

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

答案 3 :(得分:0)

试一试

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