我有一个像这样的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
包含每个相关链接的唯一电子邮件...
如果你能解决这个问题,谢谢你,
答案 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