1

我有一个 MySQL 数据库,我正在尝试创建一个 Web 界面来管理工单,现在我正在尝试像这样列出工单:[标题][创建工单的人的姓名][优先级][日期创建][负责这张票的人]

所以我有一个名为票的表,其中包含标题、创建票的人的 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]

一行(每张票)和我数据库中的所有票

4

2 回答 2

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;

如果票证确实只有一个创建者(这是有道理的),那么我会给票证 acreatoruserid以引用John. 在这种情况下,John 不需要在联结表中,您实际上也不再需要该type列。

于 2013-07-17T21:55:13.107 回答
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;
于 2013-07-18T13:16:51.067 回答