MySQL - 选择数据并创建“虚拟”表

时间:2012-10-09 06:35:19

标签: mysql select database-design model

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

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
  • “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 个答案:

答案 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