我正在尝试创建一个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中的行
答案 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
表中存储任意信息。