sql查询解决

时间:2011-12-12 18:02:25

标签: mysql sql

我有一个像这样的SQL表:

id  email           links
1   test1@test.com  www.link1.com
2   test2@test.com  www.link2.com
3   test3@test.com  www.link3.com
4   test1@test.com  www.link4.com
5   test2@test.com  www.link5.com
6   test2@test.com  www.link6.com
7   test4@test.com  www.link7.com
8   test5@test.com  www.link8.com
9   test6@test.com  www.llink9.com
10  test2@test.com  www.link10.com

我需要找到一个会产生这种结果的查询:

email                link1          link2          link3          link4
test1@zendata.ca     www.link1.com  www.link4.com
test2@zendata.ca     www.link2.com  www.link5.com  www.link6.com  www.link10.com
test3@zendata.ca     www.link3.com
test4@zendata.ca     www.link7.com
test5@zendata.ca     www.link8.com
test6@zendata.ca     www.llink9.com

包含每个相关链接的唯一电子邮件...

如果你能解决这个问题,谢谢你,

3 个答案:

答案 0 :(得分:1)

使用GROUP_CONCAT()可以更轻松地完成此操作,然后在应用程序代码中处理以拆分结果字符串:

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

示例结果:

email                link_list
--------------------------------------
test1@zendata.ca     www.link1.com,www.link4.com
test2@zendata.ca     www.link2.com,www.link5.com,www.link6.com,www.link10.com

当然,假设您将使用其他编程语言中的某些应用程序代码处理此结果集。

答案 1 :(得分:0)

如果要保持原子性(每个字段中有一个数据原子),这是不可能的。尽量不要将数据库模式(列和表)与其数据(行)混淆。

但是,您可以根据电子邮件对行进行排序,这样可以轻松地在应用程序代码中以正确的顺序获取数据。这是PHP中的一个简单示例,我甚至不必事先对结果进行排序(PHP中的“数组”实际上是一个hashmap):

$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;
}

上面的括号在某种程度上简化了“数据”和“架构”的定义,但仍然:不要混淆这两个概念

答案 2 :(得分: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