用于自定义元键的MySQL数据库设计=>价值查询

时间:2013-01-30 11:50:53

标签: mysql database-design metadata key-value

我正在为我的网站制作产品数据库。我目前有:

产品表:产品ID,产品名称,价格

Product_meta表:Pmeta_id,产品ID,metaKey,metaValue

我基本上想要它,所以我可以通过指定元键来查询产品,并将key =>值对放入其中,或者通过键获取值。

我相信Wordpress有类似的方法,但我不太确定如何制作函数来获取数据。我假设它将涉及表连接???

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

SELECT * FROM Product_meta AS M
LEFT OUTER JOIN Products AS P ON ( P.Product_ID = M.Product_ID )
WHERE M.metaKey = ...

如果Products表处于领先地位,请将其转过来:

SELECT * FROM Products AS P
LEFT OUTER JOIN Product_meta AS M ON ( P.Product_ID = M.Product_ID )
WHERE M.metaKey = ...

当您只想显示Products表和Product_meta表中的记录时,您也可以将LEFT OUTER JOIN更改为INNER JOIN

如果您想在WHERE子句中包含多个值,请使用此查询:

... WHERE M.metaKey IN (..,..,..)

确保您的数据以逗号分隔

答案 1 :(得分:1)

它会隐藏JOIN,但更重要的是,您需要 pivot 所有行,以便将这些元键作为列而不是行。类似的东西:

SELECT 
  p.productid, 
  p.productname, 
  p.price,
  MAX(CASE WHEN m.metaname = 'Type' THEN pm.metavalue END) AS 'Type',
  MAX(CASE WHEN m.metaname = 'Size' THEN pm.metavalue END) AS 'Size',
  MAX(CASE WHEN m.metaname = 'Quantity' THEN pm.metavalue END) AS 'Quantity'
FROM products p 
INNER JOIN product_meta pm ON p.productID = pm.productid
INNER JOIN metakeys m ON pm.metakey = m.metakey
GROUP BY p.productid, 
         p.productname, 
         p.price;

SQL Fiddle Demo


您也可以动态地为您拥有的所有密钥执行此操作,而不是手动编写它们:

SET @sql = NULL;

SELECT
  GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(m.metaName = ''',
      m.metaName, ''', pm.metavalue, NULL)) AS ',
      m.metaName )
  ) INTO @sql
FROM products p 
INNER JOIN product_meta pm ON p.productID = pm.productid
INNER JOIN metakeys m ON pm.metakey = m.metakey
;



SET @sql = CONCAT('SELECT p.productid, p.productname,',
                  'p.price, ', @sql,
                  ' FROM products p  ',
                  ' INNER JOIN product_meta pm ON p.productID = pm.productid ',
                  ' INNER JOIN metakeys m ON pm.metakey = m.metakey ',
                  ' GROUP BY p.productid, p.productname, p.price; ');
PREPARE stmt 
FROM @sql; 

EXECUTE stmt;

Updated SQL Fiddle Demo