2014-04-18 57 views
0

我在MySQL中有這樣的數據集,其中記錄需要摺疊成單行,但是要包裹的列數是不同的。這裏有一個例子:MySQL - 將多行包裝成一個

Id  Name     Pre/Post Attempt  Other Data 
--  --------    -------- -------  ---------- 
1  James Owens    Pre   1   blah 
1  James Owens    Post  1   blah 
1  James Owens    Post  2   blah 

2  Derek Williams   Post  1   blah 
2  Derek Williams   Post  2   blah 
2  Derek Williams   Post  3   blah 

3  Sean Parker    Pre   1   blah 

4  Miles Taylor    Pre   1   blah 
4  Miles Taylor    Post  1   blah 
4  Miles Taylor    Post  2   blah 
4  Miles Taylor    Post  3   blah 
4  Miles Taylor    Post  4   blah 

嘗試次數最多的是4,我想落得如此下場(或東西接近這個)數據:

Id  Name      Pre   Post  Post  Post  Post  Other Data 
--  -------------   ---   ----  ----  ----  ----  ---------- 
1  James Owens    1   1   2       blah 
2  Derek Williams      1   2   3     blah 
3  Sean Parker    1             blah 
4  Miles Taylor    1   1   2   3   4  blah 

我知道你」你會問「你試過了什麼?」 - 呃,我沒有嘗試過任何東西,因爲我不知道從哪裏開始。

有人能指出我正確的方向嗎?

+0

您可以簡化所需的數據嗎?現在看起來你想要一個可以有可變列的查詢。我知道這是可能的在使用動態SQL的SQL服務器,但不是很確定在MySQL中。無論如何,這聽起來像你在做什麼可以做得更好?你能不只是有兩列前後,有嘗試的次數?列中的值是否是嘗試次數?還是需要總結一下?例如德里克 - 威廉姆斯總共發帖3次? –

+0

是的,列中的數字是嘗試次數。不,他們不需要總結。我想過使用VIEW來簡化數據,但不確定這一點。 –

+0

你需要列數是動態的嗎?你不能只有兩列嗎?該查詢將會簡單得多。 –

回答

0

正如Ryan在評論中提到的,你可能只有兩列存儲前後嘗試次數。您可以通過以下方式實現此目的:

select distinct(tbl.id), name, pre_count.count, post_count.count, other_data 
from `tbl` left join (select id, count(*) as count 
         from `tbl` where pre_post = 'pre' group by id) as pre_count 
         on tbl.id = pre_count.id 
      left join (select id, count(*) as count 
         from `tbl` where pre_post = 'post' group by id) as post_count 
         on tbl.id = post_count.id 
+0

Yeap ... note爲了便於閱讀,我寧願進行連接而不是上面的語法。 –

+0

我做了必要的更改以適應我的情況,並且查詢運行正常,但是出現了0條記錄。如果有的話,我做錯了什麼? –

+0

該查詢僅適用於至少有一次嘗試前後的查詢。使用左連接來包含這些條目。 –