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