2013-11-05 65 views
-6

我SQLFiddle:http://sqlfiddle.com/#!2/729a9/1樞轉表只返回1行

正如你可以看到,儘管在表格中有被兩行,還有一個返回行。

這也是最高的ID,所以也許這與它有關?

我很難像一個日誌,很抱歉地說。

SQL:

SELECT GROUP_CONCAT(distinct 
      CONCAT(
       'max(case when `pat`.`name` = ''', 
       `pat`.name, 
       ''' then `pa`.`value` end) as `', 
       `pat`.name, '`' 
      ) 
      ) INTO @list 
FROM `product_attribute_types` pat; 

SET @sql = CONCAT('select ', @list, ' 
        from `products` `p` 
        LEFT JOIN `product_attributes` `pa` 
        ON `p`.id=`pa`.`product_id` 
        LEFT JOIN `product_attribute_types` `pat` 
         ON `pa`.`type`=`pat`.`id` 
        '); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
+5

我必須說,你刪除了你以前的問題,這個問題只是爲了重新發佈一個新版本的問題而做出的回答。如果您的要求發生變化,您應該向答案的作者發表評論或發佈新的問題。刪除和重新發布是非常粗魯的 - 10K只有用戶 - http://stackoverflow.com/questions/19775409/selecting-dynamic-column-names-from-multiple-tables – Taryn

+0

是'產品'表正確在你的小提琴?對於相同的產品ID,您有藍色褲子和綠色襯衫。 – Barmar

+0

您應該在'product_attributes'中爲'product_id,type'設置一個唯一的鍵值,以防止出現這個問題。 – Barmar

回答

1

你缺少@sql GROUP BY子句,以及該行指的是產品ID。

SET @sql = CONCAT('select p.id, ', @list, ' 
        from `products` `p` 
        LEFT JOIN `product_attributes` `pa` 
        ON `p`.id=`pa`.`product_id` 
        LEFT JOIN `product_attribute_types` `pat` 
         ON `pa`.`type`=`pat`.`id` 
        GROUP BY p.id 
        '); 

FIDDLE

+3

仍然不起作用,他們想要在顏色下顯示綠色和藍色兩種顏色 - 等另一列 - 您的返回null - http://sqlfiddle.com/#!2/729a9/27 - Fiddle顯示相同查詢的硬編碼版本。 – Taryn

+0

我不明白,你要求每個屬性的MAX,這意味着你將永遠只有1行返回。 – Sebas

+0

@bluefeet看到我上面的評論 - 我認爲他的「產品」表中有錯誤的數據。 – Barmar

2

首先:你已經以這種方式替同樣的product_id = 1,更改表product_attributes兩個屬性 -

INSERT INTO `product_attributes` (`product_id`,`type`,`value`) VALUES 
    (1,1,'blue'), 
    (1,2,'shirt'), 
    (2,1,'green'), 
    (2,2,'pants'); 

那就試試這一個 -

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'MAX(IF(pat.name = ''', name, ''', pa.value, NULL)) AS ', name 
    ) 
) INTO @sql 
FROM product_attribute_types; 

SET @sql = CONCAT('SELECT pa.product_id, ', @sql, ' FROM product_attributes pa INNER JOIN product_attribute_types pat ON pa.type = pat.id GROUP BY pa.product_id'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

結果:

+------------+-------+-------+ 
| product_id | color | name | 
+------------+-------+-------+ 
|   1 | blue | shirt | 
|   2 | green | pants | 
+------------+-------+-------+ 

如果需要,添加WHERE過濾器。