MySQL - 查询数据并创建“虚拟”表

4

假设我的数据库表如下所示:

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
元数据表
| id | meta_id | meta_value
-------------------------------
|  1 | 1       | Big headline
|  2 | 2       | Small headline
|  3 | 3       | Extra headline
  • "id"是递增的。
  • "page_id"是页面ID。一个页面上可以有多个元数据和值。
  • "meta_id"与meta_table相关联。
  • "value"可以是任何字符串。

问题

我能创建一个“虚拟”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
3个回答

4
如果我理解正确,那么您应该阅读有关mysql中的“Create view”的内容,请尝试搜索它,这样可以创建一个“虚拟数据库”-例如,将其与Mahmoud Gamal的一些代码结合使用。

1
您可以使用以下查询来实现此操作:
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;

您可以将此查询放入视图中。

max()函数在这里发挥了魔力,如果没有它尝试过却不起作用。你能简要解释/建议为什么吗? - MartinG

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接