1

ウェブサイト用の製品データベースを作成しています。私は現在持っています:

Products テーブル: 商品 ID、商品名、価格

Product_meta テーブル: Pmeta_id、製品 ID、metaKey、metaValue

私は基本的に、メタキーを指定して製品を照会し、キー=>値のペアを配置するか、キーで値を取得できるようにしたいのです。

Wordpress にも同様のアプローチがあると思いますが、データを取得する関数を作成する方法がよくわかりません。テーブル結合が含まれると思いますか???

どんな助けでも大歓迎です。

4

2 に答える 2

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 (..,..,..)

データがカンマで区切られていることを確認してください

于 2013-01-30T11:56:14.273 に答える
1

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

SQL フィドルのデモ


手動で書き込む代わりに、持っているすべてのキーに対してこれを動的に行うこともできます。

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;

更新された SQL Fiddle デモ

于 2013-01-30T12:01:32.573 に答える