簡體   English   中英

MySQL GROUP_CONCAT和DISTINCT

[英]MySQL GROUP_CONCAT and DISTINCT

我有這樣的tb1表:

name   email               link
john   myemail@gmail.com   google
john   myemail@gmail.com   facebook
john   myemail2@gmail.com  twitter
....
....
and more

當我用查詢調用數據時

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

結果像這樣:

NAME    EMAIL               SOURCE
john    myemail2@gmail.com  twitter
john    myemail@gmail.com   facebook/google
....
....
and more

sqlfiddle

我想讓結果看起來像:

NAME    EMAIL               SOURCE 1       SOURCE 2
john    myemail2@gmail.com  twitter
john    myemail@gmail.com   facebook       google

只有查詢才能生成結果嗎?

注意:我想制作動態列源1,2,3 ......,n

我的回答是, 不要這樣做!

你想要做的是稱為旋轉。 在MySQL中,這通常是用一個地獄來完成的

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

塊。 但是由於您不了解所有源代碼,因此您必須編寫一個過程來為您動態構建語句並執行它。 即便如此,你最終會得到一個類似的表結構

NAME    EMAIL               twitter     facebook    google
----------------------------------------------------------
john    myemail2@gmail.com  yes         no          no
john    myemail@gmail.com   no          yes         yes

那么,您的應用程序的程序員將如何知道列的命名方式?

為避免這種情況,您必須再次執行存儲過程中的一個程序設計,以將每個電子郵件的行值放入一列。 那么你將如何確定哪一行進入哪一列? 如果facebook出現在列source1中的一行和列source2中的另一行中,該怎么辦? 在您的應用程序中,您必須測試或以其他方式確定實際有多少列,或者每個用戶/電子郵件只能有2個來源?

總結一下,這樣的結果

name   email               link
john   myemail@gmail.com   google
john   myemail@gmail.com   facebook
john   myemail2@gmail.com  twitter

完全沒問題,應由程序開發人員來處理它。 對於他們而言,這比為團隊中的數據庫人員更容易做到這一點。

不,你不能用MySQL,你不能動態創建額外的列...(這是一個olap的東西,或者允許這樣的功能稱為數據透視表)

它可以適用於這種情況,但它不是動態查詢,只有當同一個電子郵件最多存在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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM