2015-01-21 44 views
0

我得到了表ordersorder_comments。每個訂單可以有0到n個評論。我希望按照具體的訂單獲得所有訂單的清單和評論。SQL:將行轉換爲MySQL列(SELECT語句)

orders

order_id | order_nr 
1 | 5252 
4 | 6783 
5 | 6785 


order_comments

id_order_comments | order_fk | created_at | email | content 
1 | 4 | 2015-01-12 | jack | some text here 
2 | 5 | 2015-01-13 | marta | some text here 
3 | 5 | 2015-01-14 | beata | some text here 
4 | 4 | 2015-01-16 | julia | some text here 

結果,我想獲得1行每個訂單。評論應該從最早的評論開始分列顯示。在這種情況下,因此所需的輸出是:

order_id | 1_comment_created_at | 1_comment_author | 1_comment_content | 2_comment_created_at | 2_comment_author | 2_comment_content 
1 | NULL | NULL | NULL | NULL | NULL | NULL 
4 | 2015-01-12 | jack | some text here | 2015-01-16 | Julia | some text here 
5 | 2015-01-13 | marta | some text here | 2015-01-14 | beata | some text here 

我發現這一點:MySQL - Rows to Columns - 但我不能用「創建視圖」。
我發現這個:http://dev.mysql.com/doc/refman/5.5/en/while.html - 但我不能在這個數據庫中創建過程。


我該怎麼

SELECT @c := (SELECT count(*) FROM order_comments GROUP BY order_fk ORDER BY count(*) DESC LIMIT 1); 

SET @rank=0; 
SET @test=0; 

SELECT 
    CASE WHEN @test < @c AND temp.comment_id = @test THEN temp.created_at END AS created, 
    CASE WHEN @test < @c AND temp.comment_id = @test THEN temp.author END AS author, 
    CASE WHEN @test < @c AND temp.comment_id = @test THEN temp.content END AS content 
    /*But I cannot set @test as +1. And I cannot name column with variable - like CONCAT(@test, '_created')*/ 

FROM (
    SELECT @rank := @rank +1 AS comment_id, created_at, author, content 
    FROM order_comments 
    WHERE order_fk = 4 
    ORDER BY created_at 
) AS temp 

問題:我想搜索多個定單。我應該得到沒有評論的訂單。 我能做什麼?

回答

2

可以使用變量對於這種類型的支點,但查詢是有點複雜,因爲你需要枚舉值,每個訂單:

SELECT o.order_id, 
     MAX(case when rank = 1 then created_at end) as created_at_1, 
     MAX(case when rank = 1 then email end) as email_1, 
     MAX(case when rank = 1 then content end) as content_1, 
     MAX(case when rank = 2 then created_at end) as created_at_2, 
     MAX(case when rank = 2 then email end) as email_2, 
     MAX(case when rank = 2 then content end) as content_2, 
FROM orders o LEFT JOIN 
    (SELECT oc.*, 
      (@rn := if(@o = order_fk, @rn + 1, 
         if(@o := order_fk, 1, 1) 
         ) 
      ) as rank 
     FROM order_comments oc CROSS JOIN 
      (SELECT @rn := 0, @o := 0) vars 
     ORDER BY order_fk, created_at 
    ) oc 
    ON o.order_id = oc.order_fk 
GROUP BY o.order_id; 
+0

戈登,可以請你給我解釋什麼呢它呢? '@rn = = if(@o = @order_rk,@rn + 1,if(@o:= @order_fk,1,1))'在子查詢的結果中,rank總是= 1. – suz 2015-01-22 11:13:08

+0

@suz。這就是'row_number()'的MySQL等價物,它爲每個訂單的組內的行分配一個連續的編號。 – 2015-01-22 12:36:17

+0

從我在這個查詢中看到的等級總是= 1。 – suz 2015-01-22 13:20:13