我想创建一个特定客户提交给应用程序的所有故障单的列表,以及来自开发人员的其他信息,这些信息将用于解决故障单。在应用程序中,用户可以是客户或开发人员。
一个票证可以有多个用户(例如,一个客户和开发人员),一个用户可以拥有多个票证(一个客户可以提交多个票证,而开发人员可以接收多个票证)。这就是为什么我在票证和用户之间添加了多对多关系的原因。
我这样设计数据库:
tickets tickets_users users groups
ticket_id fk_ticket_id user_id group_id
fk_user_id fk_group_id group_type
有没有一种方法可以在单个查询中与开发人员收集有关特定客户的票证信息。如果不是,您是否有更好的建议来更改我的数据库?
我想为客户安德鲁(Andrew)获取类似的清单:
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
最佳答案
您需要将用户和组两次加入到票证中,一次要让该人举起票证,一次要让开发人员来处理票证。但是,在这种情况下,开发人员无法举票。
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连接更改为左连接。
但是,如果您知道票证只有一个筹集者和一个开发人员来工作,那么您应该在票证表中包括两个引用用户表的字段,而不需要连接表。