2015-10-12 71 views
1

我試圖創建一個選擇語句,並使用虛擬列,基於與關鍵值系統不同的表。Mysql左連接旋轉90°表

可以說我有所有用戶公用表命名爲media

媒體是這樣的:

id | cust_id | filename | hidden 
55 2   lorem.jpg 0 

但有些客戶需要更多的行,所以我有第二個表:

media_id | cust_id | rowname | value 
55   2   author John Doe 
55   2   release 2015-10-10 
55   2   price  42 

我想重新創建一個表格,我可以在這些虛擬值內搜索 像

select * from media ..magical join later.. WHERE author = "John Doe"; 

這怎麼可能?我是否缺少一些方便的替代方法,讓不同的用戶擁有不同的行,並使用一個公共的主表?

我想,以避免在一列中存儲JSON數據,因爲這將是很難選擇SQL數據,但這是我目前唯一的解決辦法(選擇所有,並在應用程序解析行/網絡

回答

2

魔法加入!我喜歡它。下一版MySQL必備功能:-)

與此同時,這就是你所做的。

SELECT m.id, 
     m.cust_id, 
     a.value AS author, 
     r.value AS release, 
     p.value AS price, 
     m.filename, 
     m.hidden 
    FROM media m 
    LEFT JOIN other_table a ON m.id = a.id AND a.rowname = 'author' 
    LEFT JOIN other_table p ON m.id = p.id AND p.rowname = 'price' 
    LEFT JOIN other_table r ON m.id = r.id AND r.rowname = 'release' 

此使用LEFT JOIN的每個不同的屬性,爲other_table(你可以稱之爲一個attributes表或metadata表)將允許在一些原來的行沒有你查詢甚至工作一些元數據項目。

然後,如果您需要過濾或對其中某些項目進行排序,則可將此查詢包裝在外部查詢中。例如。

SELECT * 
    FROM (
    SELECT m.id, 
      m.cust_id, 
      a.value AS author, 
      r.value AS release, 
      p.value AS price, 
      m.filename, 
      m.hidden 
     FROM media m 
     LEFT JOIN other_table a ON m.id = a.id AND a.rowname = 'author' 
     LEFT JOIN other_table p ON m.id = p.id AND p.rowname = 'price' 
     LEFT JOIN other_table r ON m.id = r.id AND r.rowname = 'release' 
    ) all 
WHERE release >= '2010-01-01' 
ORDER BY author 

它發生,對於它的價值,是WordPress使用這種策略存儲在其wp_postmeta表中的任意信息。

+0

如果WP使用這個,那麼我可能在相同的元數據存儲系統的正確軌道!謝謝(你的)信息 –