我想创建一个特定客户提交到应用程序的所有故障单的列表,以及来自将要解决故障单的开发人员的信息。在应用程序中,用户可以是客户或开发人员。
故障单可以有多个用户(例如客户和开发人员),用户可以拥有多个故障单(客户可以提交多个故障单,开发人员可以接收多个故障单)。这就是我在门票和用户之间添加了多对多关系的原因。
我设计了这样的数据库:
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
答案 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表的字段,不需要连接表。