2

製品の名前、パラメータの名前、および一部の製品のパラメータの値の 3 つのテーブルがあります。

製品

+-------+-------------+ 
|   id  |  name       |  
+-------+-------------+
|   1   |  A100       |
+-------+-------------+
|   2   |  B250       |
+-------+-------------+

パラメータ

+-------+-------------+ 
|   id  |  name       |  
+-------+-------------+
|   1   |  width      |
+-------+-------------+
|   2   |  color      |
+-------+-------------+

paramsofproducts

+-------+-----------+-----------+-----------+ 
|   id  |  product  |  param    |  value    |
+-------+-----------+-----------+-----------+ 
|   1   |     1     |    1      |   120     |
+-------+-----------+-----------+-----------+  
|   2   |     1     |    2      |  white    |
+-------+-----------+-----------+-----------+ 
|   3   |     2     |    1      |   275     |
+-------+-----------+-----------+-----------+  
|   4   |     2     |    2      |  black    |
+-------+-----------+-----------+-----------+

そして、このテーブル (すべての製品 + 列としてのパラメーター) を 1 回のクエリで取得する方法は? JOINではできません。

+-------+----------+-----------+-----------+ 
|   id  |  name    |  width    |  color    |
+-------+----------+-----------+-----------+ 
|   1   |  A100    |   120     |  white    |
+-------+----------+-----------+-----------+ 
|   2   |  B250    |   275     |  black    |
+-------+----------+-----------+-----------+
4

1 に答える 1

1

私はあなたが望む結果を提示することはできませんが、おそらくあなたの結果のいくつかの JSON が可能な回避策です:

SELECT products.id, products.name, CONCAT('[{',GROUP_CONCAT('"',REPLACE(params.name,  '"', '\\"'),'":"', REPLACE(paramsofproducts.value, '"', '\\"'),'"'),'}]') as params
FROM paramsofproducts 
LEFT JOIN products ON products.id = paramsofproducts.product 
LEFT JOIN params ON params.id = paramsofproducts.param
GROUP BY products.name

結果:

id | name | params
1  | A100 | [{"width":"120","color":"white"}]
2  | B250 | [{"width":"275","color":"black"}]

編集:エスケープ "

于 2013-11-09T12:57:58.580 に答える