2013-11-09 32 views
1

我有三個表:產品名稱,參數名稱和參數值,部分產品:如何從三個表中獲取數據MySQL?

產品

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

PARAMS

+-------+-------------+ 
| 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 | 
+-------+-----------+-----------+-----------+ 

以及如何通過查詢此表(所有產品+參數爲列)?我不能做到寬度加入。

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

你試過了什麼? – hjpotter92

+2

你可以構造一個數據透視表查詢,但是我的偏好(特別是數字屬性['params']未知)只是返回分組和排序結果並處理表示層/應用程序級代碼中的格式。此外,您的'paramsofproducts'表中的id列大概沒有意義 - 我們也不會upvote faqs – Strawberry

+0

爲什麼不能用'JOIN'來做到這一點? – arkascha

回答

0

我不能給出你想要的結果,但也許是一些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"}] 

編輯:逃離「

+0

您將需要在所有情況下轉義一些引號才能獲得有效的JSON。 – Vatev

+0

謝謝,這是個好主意,但我無法用params來排序這張表。所以,我必須獲取數據並在PHP中創建一個排序數組。 – user2971765

+0

剛剛逃脫了「 – user2577405