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。
  • “值”可以是任何字符串。

问题

我可以创建一个“虚拟”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这次不会做。

4

3 回答 3

4

如果我理解你是正确的,那么你应该Create view在 mysql 中阅读,尝试搜索它,这样就可以制作一个“虚拟数据库” - 例如。将它与 Mahmoud Gamal 的一些代码结合起来

于 2012-10-09T06:41:26.880 回答
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;

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

于 2012-10-09T06:39:32.063 回答
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
于 2012-10-09T07:03:41.670 回答