Mysql选择1:n

时间:2010-05-23 21:28:36

标签: mysql

我有两张表1:n

content
---------
- id
- title
- text

content_meta
-------------
- id
- content_id
- meta_key
- meta_value

内容可以包含多个与之关联的content_meta寄存器。通常,content_meta将包含类别,标签,描述和所有内容,因此我真的不知道内容将具有的寄存器数量。

我想要完成的是在单个查询中获取内容寄存器以及content_meta中的所有相关寄存器。 我尝试了subselect接近,但似乎我只能得到一个寄存器/列(¿?)     选择内容。*,(                       选择 *                       FROM content_meta                       WHERE content_id = content.id                      )      来自内容

此查询会抱怨“操作数应包含1列”,因此更改“*”,例如meta_key会清除错误,但会为此子选择返回NULL ...

SELECT content.*, (
                  SELECT meta_key
                  FROM content_meta
                  WHERE content_id = content.id
                 )
 FROM content

有人能告诉我去哪儿吗?

3 个答案:

答案 0 :(得分:1)

如何在内容ID列上进行加入?

答案 1 :(得分:1)

使用:

SELECT c.*,
       cm.*
  FROM CONTENT c
  JOIN CONTENT_META cm ON cm.content_id = c.id

只有在CONTENT_META表中有支持记录时,才会返回CONTENT并且相关。如果CONTENT记录可能没有任何CONTENT_META数据,请改为使用LEFT JOIN:

   SELECT c.*,
          cm.* --these columns will be null if there is no supporting data
     FROM CONTENT c
LEFT JOIN CONTENT_META cm ON cm.content_id = c.id

跟进问题 -


  

现在可以按content.id进行分组,但是使用自己的值重命名meta_key列,并将此列的值重命名为meta_value的内容?

MySQL没有PIVOT语法 - 您必须使用CASE语句:

  SELECT c.id,
         MAX(CASE WHEN cm.meta_key = 'A' THEN cm.meta_value ELSE NULL END) AS 'A',
         MAX(CASE WHEN cm.meta_key = 'B' THEN cm.meta_value ELSE NULL END) AS 'B',
         MAX(CASE WHEN cm.meta_key = 'C' THEN cm.meta_value ELSE NULL END) AS 'C'
    FROM CONTENT c
    JOIN CONTENT_META cm ON cm.content_id = c.id
GROUP BY c.id

您必须为要在结果集中显示的每个人指定meta_key

答案 2 :(得分:0)

SELECT * FROM content
LEFT JOIN content_meta ON content.id = content_meta.content_id
相关问题