从单票请求多个用户| mysql很多很多

时间:2015-10-28 13:25:46

标签: mysql sql database mysqli normalization

我想创建一个特定客户提交到应用程序的所有故障单的列表,以及来自将要解决故障单的开发人员的信息。在应用程序中,用户可以是客户或开发人员。

故障单可以有多个用户(例如客户和开发人员),用户可以拥有多个故障单(客户可以提交多个故障单,开发人员可以接收多个故障单)。这就是我在门票和用户之间添加了多对多关系的原因。

我设计了这样的数据库:

tickets     tickets_users   users         groups
ticket_id   fk_ticket_id    user_id       group_id
            fk_user_id      fk_group_id   group_type

是否有办法在单个查询中与开发人员一起收集特定客户的票证信息。如果没有,你有更好的建议改变我的数据库吗?

我希望为客户安德鲁得到一个类似的列表:

ticket status     ticket priority  developer
Identify ticket    high             John
Identify ticket    low              Austin
etc                etc              etc 

到目前为止,我已经提出了这个问题:

SELECT * FROM tickets t 
  JOIN tickets_users tu ON tu.fk_ticket_id=t.ticket_id
  JOIN users u ON u.user_id=tu.fk_user_id
  JOIN groups g ON g.group_id=u.fk_group_id
  WHERE user_id = $customerId

1 个答案:

答案 0 :(得分:0)

您需要将用户和群组两次加入到故障单中,一次是为了让一个人提出一张票,一次是让开发人员来处理它。但是,在这种情况下,开发人员无法提出票证。

SELECT t.ticket_status, t.ticket_priority, u2.user_name as developer FROM tickets t 
  JOIN tickets_users tu ON tu.fk_ticket_id=t.ticket_id
  INNER JOIN users u1 ON u1.user_id=tu.fk_user_id AND u1.user_id = $customerId
  INNER JOIN groups g1 ON g1.group_id=u1.fk_group_id AND g1.group_type=1
  INNER JOIN users u2 ON u2.user_id=tu.fk_user_id
  INNER JOIN groups g2 ON g2.group_id=u2.fk_group_id AND g2.group_type=2

如果故障单没有分配开发人员,则它不会显示在报告中。如果要在结果集中包含这些连接,则需要将u2和g2连接更改为左连接。

但是,如果您知道故障单有一个提升者和一个开发人员,那么您应该在故障单表中包含2个引用users表的字段,不需要连接表。