[英]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
我想讓結果看起來像:
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.