Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义元密钥的MySQL数据库设计=>;值查询_Mysql_Database Design_Metadata_Key Value - Fatal编程技术网

自定义元密钥的MySQL数据库设计=>;值查询

自定义元密钥的MySQL数据库设计=>;值查询,mysql,database-design,metadata,key-value,Mysql,Database Design,Metadata,Key Value,我正在为我的网站制作一个产品数据库。我目前有: 产品表:产品ID、产品名称、价格 产品元表:Pmeta\u id、产品id、元键、元值 我基本上需要它,这样我就可以通过指定元键来查询产品,并将key=>value对放入其中,或者通过键获取值 我相信Wordpress也有类似的方法,但不太确定如何制作函数来获取数据。我想它会涉及到表连接 任何帮助都将不胜感激 SELECT * FROM Product_meta AS M LEFT OUTER JOIN Products AS P ON ( P.P

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

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

产品元表:Pmeta\u id、产品id、元键、元值

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

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

任何帮助都将不胜感激

SELECT * FROM Product_meta AS M
LEFT OUTER JOIN Products AS P ON ( P.Product_ID = M.Product_ID )
WHERE M.metaKey = ...
或者,如果产品表处于领先地位,则将其扭转:

SELECT * FROM Products AS P
LEFT OUTER JOIN Product_meta AS M ON ( P.Product_ID = M.Product_ID )
WHERE M.metaKey = ...
当您只想显示产品表和产品元表中的记录时,还可以将
左外部联接
更改为
内部联接

如果希望在
WHERE
子句中有多个值,请使用以下查询:

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

确保数据是逗号分隔的

它将Invlovele
JOIN
,但更重要的是,您需要将所有行作为轴,以便将这些元键作为列而不是行。比如:

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;

您还可以为所有密钥动态执行此操作,而不是手动写入密钥:

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;