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