2011-12-12 54 views
0

我有一個SQL表像這樣的:SQL查詢來解決

id email   links 
1 [email protected] www.link1.com 
2 [email protected] www.link2.com 
3 [email protected] www.link3.com 
4 [email protected] www.link4.com 
5 [email protected] www.link5.com 
6 [email protected] www.link6.com 
7 [email protected] www.link7.com 
8 [email protected] www.link8.com 
9 [email protected] www.llink9.com 
10 [email protected] www.link10.com 

,我需要找到一個查詢,這將使這種結果:

email    link1   link2   link3   link4 
[email protected]  www.link1.com www.link4.com 
[email protected]  www.link2.com www.link5.com www.link6.com www.link10.com 
[email protected]  www.link3.com 
[email protected]  www.link7.com 
[email protected]  www.link8.com 
[email protected]  www.llink9.com 

獨特的電子郵件與每個相關鏈接...

謝謝你,如果你能解決這個問題,

+0

你能不能給我們一點信息你對數據做了什麼?例如,你有使用的腳本語言嗎? – Ryan

+1

你知道最多的鏈接數量嗎? –

+0

上週有人在帖子中說這是一個數據透視表功能。 – jp2code

回答

1

這是更容易與做然後在應用程序代碼中處理,以分割所得到的字符串:

SELECT email, GROUP_CONCAT(links) AS link_list FROM tbl GROUP BY email 

實施例的結果:

email    link_list 
-------------------------------------- 
[email protected]  www.link1.com,www.link4.com 
[email protected]  www.link2.com,www.link5.com,www.link6.com,www.link10.com 

這假設,當然,你將處理這個結果與一些應用程序設置使用其他編程語言編寫代碼。

+0

如果鏈接包含','字符怎麼辦? –

+0

@EmilVikström使用SEPARATOR子句http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat – gbn

+0

@EmilVikström您可以使用替代分隔符,如'|'它不會出現在你的結果集中。查看另一條評論中鏈接的文檔。 –

0

如果要維護原子性(每個字段中包含一個數據原子),則這是不可能的。儘量不要將數據庫模式(列和表)與其數據(行)混淆。

但是,您可以根據電子郵件對行進行排序,這樣可以很容易地在應用程序代碼中以正確的順序獲取數據。下面是在PHP,其中I甚至沒有將結果預先排序一個簡單的例子(「陣列」在PHP實際上是一個散列映射):上述

$linksForEmail = array(); 
$resultset = mysql_query('SELECT email, links FROM table;'); 
while ($a = mysql_fetch_array($resultset, MYSQL_NUM)) { 
    list($email, $link) = $a; 
    if (!isset($linksForEmail[$email]) 
    $linksForEmail[$email] = array(); 

    //Add to the array 
    $linksForEmail[$email][] = $link; 
} 

括號是「數據的略微簡化的定義「和‘模式’,但仍:不要混淆這些兩個概念

0

如果沒有很多不同的環節,你可以做這樣的事情

select 
email, 
max(case when links = 'link1' then links else '' end) as link1, 
max(case when links = 'link2' then links else '' end) as link2, 
max(case when links = 'link3' then links else '' end) as link3, 
max(case when links = 'link4' then links else '' end) as link4 
from table 
group by email