我有一个包含以下表格的模式:
posts
(id
,title
等)metas
(id
,post_id
(帖子的外键),meta_key
,meta_value
)我想查询所有帖子的列表,还要包含一个包含特定元字段的列。对于此示例,假设要获取的元字段为rating
- 即meta_key
为“评级”。
对于没有带“评级”键的元字段的帖子,该字段将为空白。期望结果的例子:
| posts.id | posts.title | rating |
|----------|-------------|--------|
| 1 | Foo | 3 |
| 2 | Bar | |
这是我提出的一个几乎有效的查询。它的问题在于,如果帖子具有在“评级”之前查询的其他元字段,则由于GROUP BY指令而导致没有为元字段返回任何内容。
SELECT posts.id, posts.title if(metas.meta_key = 'rating', metas.meta_value, '') as 'rating'
FROM posts
LEFT JOIN metas ON posts.id = metas.post_id
GROUP BY posts.id;
我觉得查询的SELECT部分中的条件应该以某种方式合并到JOIN中。
答案 0 :(得分:2)
所以,看看评级:
SELECT p.id, p.title, max(m.meta_value) as rating
FROM posts p LEFT JOIN
metas r
ON p.id = m.post_id AND m.meta_key = 'rating'
GROUP BY p.id;
您也可以使用您的逻辑在表达式之前使用max()
之类的聚合函数来执行此操作。
答案 1 :(得分:1)
您没有正确加入外部。
你说:找到post_id的metas,如果不存在这样的记录那么......
但你想说:找到post_id和关键'评级'的元数据......
所以:
SELECT
p.id,
p.title,
m.meta_value as rating
FROM posts p
LEFT JOIN metas m ON m.post_id = p.id and m.meta_key = 'rating';
(我假设每个post_id只有一个条目,metas只有meta_key,所以你不需要在这里聚合任何东西。)