SQL从多个表中选择并按特定条件排序

时间:2015-11-20 09:27:29

标签: php mysql sql

我有2个表,customertickets

我希望能够从故障单表中选择并按以下顺序排序:

tickets.priority然后customer.category_priority然后tickets.queue_time

我有这个问题:

SELECT t.*
from tickets t
  JOIN customer c ON t.company = c.sequence
WHERE t.status <> 'Completed' AND t.queue = 'Y'
ORDER BY field(t.priority, 'Critical', 'High', 'Medium', 'Low'), t.queue_time ASC

适用于tickets.prioritytickets.queue_time

但我不确定如何合并customer.category_priority

所以在customer表中,我的列名为:

priority_computers
priority_telephone
priority_software

所有INT字段,其值为0,1或2

tickets中的行有一个category列,可以是ComputersTelephoneSoftware,这就是需要链接到上面的内容。

因此,如果客户行的priority_computers为2且tickets行为category = 'Computers',则该列位于列表顶部,因为客户记录的优先级为{{ 1}}它还会包含其他2条件

示例:

客户:

  • 公司A priority_computers = 1
  • 公司B priority_computers = 2
  • 公司C priority_computers = 3

示例一:

  • Ticket 1 Company A priority = Medium category = Computers queue_time = 2015-11-20 08:00
  • 票2公司B优先级=中等类别=计算机 queue_time = 2015-11-20 10:00:00
  • Ticket 3 Company C priority = Medium category = Computers queue_time = 2015-11-20 08:30:00

这应按以下顺序输出:

  • Ticket 3
  • Ticket 2
  • Ticket 1

示例2:

  • 机票1公司B优先级=高级别=计算机
    queue_time = 2015-11-20 12:00
  • Ticket 2 Company A priority = Medium category = Computers queue_time = 2015-11-20 07:00:00
  • Ticket 3 Company C priority = Medium category = Computers queue_time = 2015-11-20 07:00:00

这应按以下顺序输出:

  • Ticket 1
  • Ticket 3
  • Ticket 2

1 个答案:

答案 0 :(得分:1)

如果我理解正确,那么你的问题是你必须以某种方式将数据与列名匹配。

  • ticket.priority_computers for ticket.category ='Computers'
  • customer.priority_telephone for ticket.category ='Telephone'
  • ticket.priority_software for ticket.category ='Software'

这显示了数据库设计缺陷。应该有一个customer_priority表,而每行都包含一个客户,一个类别和相关的值。然后你可以简单地加入。

按原样,您必须检查数据内容并决定要在查询中使用的列:

SELECT t.*
from tickets t
  JOIN customer c ON t.company = c.sequence
WHERE t.status <> 'Completed' AND t.queue = 'Y'
ORDER BY field(t.priority, 'Critical', 'High', 'Medium', 'Low')
  , case t.category 
      when 'Computers' then c.priority_computers
      when 'Telephone' then c.priority_telephone
      when 'Software' then c.priority_software
    end
  , t.queue_time ASC

更新:如果您有customer_priority表,那么这是您要编写的查询。您看,您的查询不需要知道存在哪些类别以及如何处理它们。

SELECT t.*
from tickets t
  JOIN customer c ON t.company = c.sequence
  JOIN customer_priority cp ON cp.customer_id = c.sequence
                            AND cp.category = t.category
WHERE t.status <> 'Completed' AND t.queue = 'Y'
ORDER BY field(t.priority, 'Critical', 'High', 'Medium', 'Low')
  , cp.priority_value
  , t.queue_time ASC

此外:如上所述,有一个表customer很奇怪,但在tickets中它不是一个客户,而是一个公司,并且在customer表本身中,它也不被称为客户号码或ID,而是序列。这使查询的可读性降低。我建议,如果可能的话,你要更改名称,以便它们保持一致。

此外,您的查询不应该知道“严重”和“高”的含义。应该有一个优先级表,其中每个优先级都有一个名称和一个值,因此查询可以简单地选择值并使用它而不必知道有关优先级的任何其他内容。