构建复杂的SQLite查询

时间:2014-08-30 15:11:16

标签: sql sqlite

我很难获得复杂的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,并将所有与会者姓名加入一列。

对此的任何帮助都会很棒;我一直在接近,但不能很好地完成它。

添加,我没有创建这个数据库所以我知道它不是最好的设计,我只是想查询它。

1 个答案:

答案 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)。