我有一个MySQL数据库,我正在尝试创建一个网络界面来管理门票,现在我正试图列出这样的门票: [标题] [创建票证的人的姓名] [优先级] [创建日期] [负责此票的人]
所以我有一张名为ticket的表,其中包含标题,创建票证的人的ID,优先级,日期。
我有另一个名为users的表,您可以在其中找到姓名和其他一些带有ID的信息(您可以使用该ID链接两个表)
我有另一个名为tickets_users的表,您可以在其中找到负责票证的人的ID
我的问题是我不知道如何在一个请求中链接所有这一切,如果只有一个人负责一张票可能很简单但是可以有多个人,我尝试了一些查询,但我总是得到当有一个人负责一张票时,门票标题等为双倍。
提前致谢 编辑 表格示例:
tickets:
-id = 523 | title = help with internet explorer | priority = 3 | date = 2013-10-10 11:20:51
users:
-id = 25 | firstname = John | lastname = Light
-id = 35 | firstname = Dwight | lastname = Night
-id = 53 | firstname = Maria | lastname = Sun
tickets_users :
-ticketid = 523 | userid = 25 | type = 1
-ticketid = 523 | userid = 35 | type = 2
-ticketid = 523 | userid = 53 | type = 2
我希望能够提出要求显示:
[help with internet explorer][John Light][3][2013-10-10 11:20:51][Maria Sun - Dwight Night]
在一行(每张票)和我的数据库中的所有票据
答案 0 :(得分:1)
您可以使用group_concat
聚合函数将链接人员的姓名分组到结果中的单个字段中。由于我没有确切的表格结构,我已经编写了字段和表格的名称。
select
t.title,
group_concat(
case when tu.type = 1 then
concat(u.firstname, ' ', u.lastname)
end) as creator,
t.priority,
t.date,
group_concat(
case when tu.type = 2 then
concat(u.firstname, ' ', u.lastname)
end SEPARATOR ' - ') as users
from
tickets t
inner join tickets_users tu on tu.ticketid = t.id
inner join users u on u.id = tu.userid
group by
t.id;
如果确实只有一个故障单的创建者(这是有道理的),那么我会给creatoruserid
一张票来引用John
。在这种情况下,John不需要在联结表中,您实际上不再需要type
列。
答案 1 :(得分:0)
我处理问题并获得预期结果。
select t.title,
group_concat(
case when tu.type = 1 then
concat(u.firstname, ' ', u.lastname)
end) as creator,
t.priority,
t.date,
group_concat(
case when tu.type = 2 then
concat(u.firstname, ' ', u.lastname)
end SEPARATOR ' - ') as users
from tickets t
inner join tickets_users tu on t.id=tu.ticketid
inner join users u on u.id=tu.userid
where t.id=523;