我很难获得复杂的SQLite查询来输出我想要的数据。
我在数据库中有以下表格(为了问题而简化和调整)。
ID | Name | Date | main_contact | Conference ID
1 | BH 13 | 01/02/13 | 123 | 4534534
2 | HITB | 03/05/13 | 345 | 5345435
3 | Troopers | 04/04/13 | 666 | 6545345
4 | DEF CON 13 | 08/08/13 | 123 | 5345633
5 | APP Sec | 10/10/13 | 345 | 3456789
6 | BH 14 | 01/02/14 | 123 | 4534534
7 | DEF CON 14 | 08/08/14 | 666 | 5345633
ID | Name Row | Conference ID
1 | 2 | 6545345
2 | 4 | 6545345
3 | 5 | 6545345
4 | 1 | 4534534
5 | 2 | 4534534
6 | 3 | 5345435
7 | 1 | 5345633
8 | 4 | 5345633
9 | 2 | 3456789
10 | 3 | 3456789
11 | 5 | 3456789
ID | Name | Fallback_Name | Contact_id
1 | Tom | T. Carnes | 123
2 | Matt | M. Dotes | 879
3 | NULL | J. Barnes | 345
4 | Trevor | NULL | 666
5 | Sam | NULL | 426
正如您可能(或可能不会)注意到的那样,会议ID将重新用于同一年度的会议。
所以我想要做的是构建一个查询,按如下方式创建输出;
Conference Name | Date | Main Contact | Attendees
BH 13 | 01/02/13 | Tom | Tom, Matt
HITB | 03/05/13 | J. Barnes | J. Barnes
Troopers | 04/04/13 | Trevor | Matt, Trevor, Sam
DEF CON 13 | 08/08/13 | Tom | Tom, Trevor
APP Sec | 10/10/13 | J. Barnes | Matt, J. Barnes, Sam
BH 14 | 01/02/14 | Tom | Tom, Matt
DEF CON 14 | 08/08/14 | Trevor | Tom, Trevor
所以,几点。如果Name为空,请使用fallback_name,并将所有与会者姓名加入一列。
对此的任何帮助都会很棒;我一直在接近,但不能很好地完成它。
添加,我没有创建这个数据库所以我知道它不是最好的设计,我只是想查询它。
答案 0 :(得分:2)
由于SQLite支持group_concat,这不难实现:
select
c.name as "Conference Name",
c.Date,
coalesce(n2.name, n2."fallback_name") as "Main Contact",
group_concat(coalesce(n.name, n."fallback_name"), ', ') as Attendees
from conferences c
inner join attendees a on c."Conference ID" = a."Conference ID"
inner join name n on n.id = a."Name Row"
inner join name n2 on n2.Contact_id = c."main_contact"
group by c.name
order by c.date
请注意,连接元素的顺序是任意的。
Sample SQL Fiddle使用SQLite(SQL.js)。