2013-10-08 202 views
5

我TB1表是這樣的:MySQL的GROUP_CONCAT和DISTINCT

name email    link 
john [email protected] google 
john [email protected] facebook 
john [email protected] twitter 
.... 
.... 
and more 

當我打電話數據與查詢看起來像

SELECT name, email, group_concat(DISTINCT link SEPARATOR '/') as source 
FROM tb1 
group by email 

,並導致像這樣:

NAME EMAIL    SOURCE 
john [email protected] twitter 
john [email protected] facebook/google 
.... 
.... 
and more 

sqlfiddle

我想讓結果看起來像:

NAME EMAIL    SOURCE 1  SOURCE 2 
john [email protected] twitter 
john [email protected] facebook  google 

它可以使結果只與查詢?

注:我要讓動態列源1,2,3 ...,N

+0

這是一個變化的數據透視表(從理論上講,源1,源2 ....可以繼續的X射線源根據不同的來源值的X個了吧?)如果是這樣,你應該尋找「MySQL的數據透視表」 ,也有一些偉大的(儘管是不平凡的)文章[MySQL的數據透視表(HTTP的 – AgRizzo

+0

可能重複://計算器。com/questions/7674786/mysql-pivot-table) – ModulusJoe

+0

感謝@AgRizzo for ref,我將閱讀關於mysql數據透視表。這個問題可以成立。當我堅持使用MySQL數據透視表時,我會更新我的問題。 – itx

回答

1

不,你不能因爲與MySQL不能創建動態附加列...(這是更一個OLAP東西或至極允許所謂的透視表)這樣的功能

+1

他從來沒有提到dinamic – AdrianBR

+0

@AdrianBR如果它不動態,那麼我的答案可以工作,但提問者需要驗證它。 –

1

它可以爲這種情況下工作,但它不是一個動態查詢,如果有最大本作同樣的電子郵件鏈接2只能工作。

SELECT `name`, email, 
substring_index(group_concat(DISTINCT link SEPARATOR '/'),'/',1) as source_1, 
if(group_concat(DISTINCT link SEPARATOR '/') like '%/%', 
substring_index(group_concat(DISTINCT link SEPARATOR '/'),'/',-1),'') as source_2 
FROM test2 group by email 

如果您知道每個電子郵件存在鏈接的可能性的確切數量,則可以相應地修改相同的查詢。

+1

會正常工作,聰明地使用if。 – AdrianBR

2

我的回答是,不這樣做!

你想要做什麼叫做旋轉。在MySQL中,這通常通過一個地獄來完成。

.... 
aggregate_function(case when ...), 
aggregate_function(case when ...), 
aggregate_function(case when ...), 
... 

block。但是由於您不知道所有的來源,您必須編寫一個過程爲您動態構建語句並執行它。即使如此,你最終會得到一個像表結構

NAME EMAIL    twitter  facebook google 
---------------------------------------------------------- 
john [email protected] yes   no   no 
john [email protected] no   yes   yes 

那麼,你的應用程序的程序員將如何知道列的命名?

爲了避免這種情況,你不得不再做編程的地獄在您的存儲過程把每封電子郵件的行值成一列。那麼你如何確定哪一行進入哪一列?如果facebook在列source1中出現在一行中,並在列source2中出現在另一行中,該怎麼辦?在你的應用程序中,你必須測試或確定實際上有多少列,或者每個用戶/電子郵件只能有2個來源?

總結的事情了,因此像這樣的

name email    link 
john [email protected] google 
john [email protected] facebook 
john [email protected] twitter 

是完全沒有問題,它是由應用程序開發人員來處理它。對於他們來說,要比團隊中的數據庫人員容易得多。