MySQL 左连接

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

最佳答案

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。

关于MySQL 左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6847374/

相关文章:

php - while 循环按列数复制记录

mysql - 为什么这条 MySQL 语句会抛出语法错误?

wordpress - 来自 Facebook 的 http 图片破坏了 https 证书

wordpress - 如何让 WordPress 停止永久链接非 wp 目录?

mysql - 来自同一个表的连接计数

mysql - 我可以将unit关键字保存到MYSQL中的变量中吗?

MySQL:基于多列的连接

php - 在 Woocommerce 中的产品自定义循环上启用 Ajax 添加到购物车按钮

php - SQL左连接数组部分为空

MySQL连接两个表但先过滤