2012-10-09 75 views
3

比方說,我的數據庫表看起來像這樣:MySQL的 - 選擇的數據,並創建一個 「虛擬」 表

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

問題

我可以創建一個 「虛擬」 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不會做這一次。

回答

2

如果我理解你是正確的,那麼你應該在mysql中閱讀Create view,嘗試搜索它,這樣就可以製作一個「虛擬數據庫」 - 例如。將它與來自Mahmoud Gamal的一些代碼結合起來

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; 

你可以把這個查詢放在一個視圖。

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