2011-12-12 52 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