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