我有两张表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
有人能告诉我去哪儿吗?
答案 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