これは関連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;