mysql - 从一张票中请求多个用户 | mysql多对多

标签 mysql sql normalization

我想创建一个列表,其中包含特定客户提交到应用程序的所有工单,以及开发人员将要解决该工单的附加信息。在应用程序中,用户可以是客户或开发人员。

一张工单可以有多个用户(例如客户和开发人员),一个用户可以有多个工单(一个客户可以提交多张工单,开发人员可以收到多张工单)。这就是为什么我在工单和用户之间添加了多对多关系。

我这样设计数据库:

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 连接更改为左连接。

但是,如果您知道一张工单只有一个筹款人和一个开发人员,那么您应该在工单表中包含引用用户表的 2 个字段,而不需要连接表。

关于mysql - 从一张票中请求多个用户 | mysql多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33392277/

相关文章:

php - MYSQL从内网和外网读取文件为什么数据包乱序?

php - 基于多选 jQuery 和 PHP 显示 DIV 文本

sql - 查询以从不同的表中选择不同的值并且不让它们重复(将它们显示为平面文件)

sql - 规范化自引用属性

r - 在 R 中规范化系统发育树

sql - 数字 ID 与字符串 ID

mysql - 传递给 Mysql 数据库的语句未填充数据表

mysql - 想在 SQL 列中使用数学,但它不是 INT

mysql - 每行列子集为空的表的正确设计

多个类别的 MySQL LIMIT