从MySQL中的连接表中查询特定的元字段

时间:2016-02-18 11:48:47

标签: mysql sql

我有一个包含以下表格的模式:

  • posts idtitle等)
  • metas idpost_id(帖子的外键),meta_keymeta_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中。

2 个答案:

答案 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,所以你不需要在这里聚合任何东西。)