MySQL左连接

MySQL左连接,mysql,wordpress,left-join,Mysql,Wordpress,Left Join,我有两个表(Wordpress数据库),一个存储帖子,另一个存储帖子元数据。在本例中,posts表存储有关场馆(即酒吧或俱乐部)的信息。元表存储用户/访问者对这些条的评级。评级存储为20、40、60、80或100,在“U评级”键下。我有以下疑问 SELECT posts.*, AVG(meta.meta_value) as average FROM wp_posts as posts LEFT JOIN wp_postmeta as meta ON posts.ID = meta

我有两个表(Wordpress数据库),一个存储帖子,另一个存储帖子元数据。在本例中,posts表存储有关场馆(即酒吧或俱乐部)的信息。元表存储用户/访问者对这些条的评级。评级存储为20、40、60、80或100,在“U评级”键下。我有以下疑问

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_PosteTa表中没有“_评级”条目,因此不会将其拉入查询

问题是:我如何从数据库中提取所有场馆的平均评分,即使它们还没有收到评分。提前谢谢


编辑:如果一个场馆还没有评级,那么在wp_Posteta表中就没有评级条目,这就提出了一个问题,NULL到底意味着什么?NULL通常用于未知值。但是,当表中的条目完全丢失时,是否仍将其视为NULL?或者它只是变成了一个空行集?

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

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

    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
。。。不确定这是否会按原样工作,但想法就在那里。。。将“平均值”设为计算字段,而不是联接。

尝试一下

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

meta.meta\u key='\u rating'
放在连接条件中,而不是放在
WHERE
子句中,即(未测试):


还要注意
GROUP BY
子句中的变化;如果没有匹配的元数据记录,
meta.post\u ID
将为空。

这不起作用,因为空值与不存在的条目不同。您如何描述不存在的评分条目?据我所知,在未排名场馆的情况下,其评级未设置,si是meta.meta_值未设置还是..?我已经编辑了我的初始答案,但仍然不确定您是想简单地计算所有未排名场馆(当所有场馆都有0值时计算它们是有意义的?)还是只将所有场馆包括在最终结果集中我喜欢此选项,但它似乎不起作用。请检查我帖子中的编辑。当调整到包含查询中的所有组件时,这实际上是有效的。我正在测试一些较短的解决方案,看看它们现在是否有效,但如果不行,您的解决方案就是赢家!谢谢这是唯一的解决方案,如果没有一个场馆的评级键存在!
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