我有2个表,customer
和tickets
我希望能够从故障单表中选择并按以下顺序排序:
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.priority
和tickets.queue_time
但我不确定如何合并customer.category_priority
所以在customer表中,我的列名为:
priority_computers
priority_telephone
priority_software
所有INT字段,其值为0,1或2
tickets
中的行有一个category
列,可以是Computers
,Telephone
或Software
,这就是需要链接到上面的内容。
因此,如果客户行的priority_computers
为2且tickets
行为category = 'Computers'
,则该列位于列表顶部,因为客户记录的优先级为{{ 1}}它还会包含其他2
条件
示例:
客户:
示例一:
这应按以下顺序输出:
示例2:
这应按以下顺序输出:
答案 0 :(得分:1)
如果我理解正确,那么你的问题是你必须以某种方式将数据与列名匹配。
这显示了数据库设计缺陷。应该有一个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,而是序列。这使查询的可读性降低。我建议,如果可能的话,你要更改名称,以便它们保持一致。
此外,您的查询不应该知道“严重”和“高”的含义。应该有一个优先级表,其中每个优先级都有一个名称和一个值,因此查询可以简单地选择值并使用它而不必知道有关优先级的任何其他内容。