2015-11-20 3 views
0

У меня есть 2 таблицы, customer и ticketsSQL выбора из нескольких таблиц и упорядочения определенных условий

Я хочу, чтобы иметь возможность выбрать из таблицы билетов и порядка:

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 

WHI ч отлично работает для tickets.priority и tickets.queue_time

, но им не уверен, как включить customer.category_priority

поэтому в таблице клиентов, у меня есть столбцы с именами, как:

priority_computers 
priority_telephone 
priority_software 

все INT поля и имеют значение 0, 1 или 2

строки в tickets имеет category столбец, который является либо Computers, Telephone или Software и т. Д., Что нужно связать с приведенным выше.

так, если строка клиент имеет priority_computers 2 и tickets строки category = 'Computers', что будет в верхней части списка, так как запись клиента имеет приоритет 2 и было бы также включить еще и другие ORDER BY условий

Примеры:

Клиенты:

priority_computers
  • Компания A = 1
  • Компания B priority_computers = 2
  • Компания C priority_computers = 3

Пример Один:

  • билетов 1 Компания Приоритет = средний = категория Компьютеры queue_time = 2015-11-20 08:00
  • Билет 2 Компания B приоритет = Средняя категория = Компьютеры queue_time = 2015-11-20 10:00:00
  • Билет 3 Компания C приоритет у = средняя категория = Компьютеры queue_time = 2015-11-20 08:30:00

Это должно выводиться в следующем порядке:

  • Ticket 3
  • Билет 2
  • билетов 1

Пример 2:

  • Билет 1 Компания Приоритет B = высокая категория = Компьютеры
    queue_time = 2015-11-20 12:00
  • Билет 2 Компания Приоритет = средняя категория = Компьютеры queue_time = 2015-11-20 7:00: 00
  • билет 3 Компания C приоритет = средняя категория = Компьютеры queue_time = 2015-11-20 07:00:00

Это должно выводиться в следующем порядке:

  • Билет 1
  • Билет 3
  • Билет 2
+2

Можете ли вы предоставить образцы данных и ожидаемый результат? –

+0

проверить мое обновление, дайте несколько примеров фиктивных данных, которые, я надеюсь, помогут – charlie

+0

Так что есть только один клиент за билет? ('JOIN customer c ON t.company = c.sequence' немного запутан, тогда я бы ожидал, что это будет« JOIN customer c ON t.customer_id = c.customer_id'). Или может быть больше клиентов за один билет? Если да, то как с этим бороться? –

ответ

1

Если я понимаю правильно, то ваша проблема в том, что вы должны соответствовать данные с именами столбцов так или иначе.

  • customer.priority_computers для
  • customer.priority_telephone ticket.category = 'Computers, для билета.категория = 'Телефон'
  • customer.priority_software для ticket.category = 'Программное обеспечение'

Это показывает, дизайн базы данных изъян. Вместо этого должна быть таблица 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 

Update: Вот запрос вы бы написать, если у вас есть таблица 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 либо, но последовательность. Это делает запросы менее читабельными. Я предлагаю вам изменить имена, если это возможно, чтобы они были согласованными.

Также ваш запрос не должен знать, что означает «Критический» и «Высокий». Должна быть таблица приоритетов, в которой каждый приоритет имеет имя и значение, поэтому запрос может просто выбрать значение и работать с ним, не зная ничего о приоритетах.

+0

Я могу создать таблицу с этой информацией, которая не была бы проблема. если я это сделаю, то тогда будет нужен запрос – charlie

+0

Я обновил свой ответ, показывая это. –

+0

отлично - что произойдет, если в таблице customer_priority строк не существует - иногда это может быть так. – charlie

Смежные вопросы