假设我的数据库表如下所示:
page_table
| id | page_id | meta_id | value
----------------------------------------
| 1 | 2 | 1 | Testing value
| 2 | 2 | 2 | Small content
| 3 | 2 | 1 | Another value
| 4 | 2 | 2 | Tiny value
| 5 | 3 | 1 | Text
| 6 | 3 | 2 | Content
| 7 | 3 | 3 | New text
meta_table
| id | meta_id | meta_value
-------------------------------
| 1 | 1 | Big headline
| 2 | 2 | Small headline
| 3 | 3 | Extra headline
问题
我可以创建一个“虚拟”SQL表来轻松使用这些数据吗?
虚拟表 - 我的建议
| id | page_id | Big headline | Small headline | Extra headline
----------------------------------------------------------------
| 1 | 2 | Testing value | Small content |
| 2 | 2 | Another value | Tiny value |
| 3 | 3 | Text | Content | New text
以上是页表和元表中的相同内容。这就是我想要的SQL。
我走了多远
SELECT * from page_table
这次不会这样做。
答案 0 :(得分:2)
如果我理解你是正确的,那么你应该阅读mysql中的Create view
,尝试搜索它,这样就可以创建一个“虚拟数据库” - 例如。将它与Mahmoud Gamal的一些代码结合起来
答案 1 :(得分:0)
您可以使用以下查询来实现此目的:
SELECT m.id, p.page_id,
MAX(CASE WHEN meta_value = 'Big headline' THEN p.value END) AS 'Big headline',
MAX(CASE WHEN meta_value = 'Small headline' THEN p.value END) AS 'Small headline',
MAX(CASE WHEN meta_value = 'Extra headline' THEN p.value END) AS 'Extra headline'
FROM meta_table m
LEFT JOIN page_table p ON m.meta_id = p.meta_id
GROUP BY m.id, p.page_id;
您可以将此查询放在视图中。
答案 2 :(得分:0)
有一种方法可以大致相同的方式获取数据,只是按行,而不是像发布的那样。
如果您运行此查询:
select mt.meta_value, group_concat(pt.value SEPARATOR ", ")
from page_table pt,
meta_table mt
where pt.meta_id = mt.meta_id
group by mt.meta_value;
这可以获得您想要的数据,每行只有一个“列”:
Big headline Testing value, Text, Another value
Extra headline New text
Small headline Small content, Content, Tiny value