Mysql左连接旋转90°表

时间:2015-10-12 16:23:12

标签: mysql sql

我正在尝试创建一个select语句并使用基于具有键值系统的不同表的虚拟列。

假设我有一个名为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中选择数据,但这是我目前唯一的解决方案(选择所有并解析app / web中的行

1 个答案:

答案 0 :(得分: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'

other_table(您可能称之为attributes表或metadata表)中的每个不同属性使用LEFT JOIN将使您的查询即使在某些情况下也能正常工作您的原始行没有一些元数据项。

然后,如果您需要对其中某些项进行过滤或排序,请将此查询包装在外部查询中。例如。

 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表中存储任意信息。