MySQL 5.6 Запрос SELECT UNION - PullRequest
       25

MySQL 5.6 Запрос SELECT UNION

0 голосов
/ 29 января 2020

Запрос SELECT UNION ниже работает по мере необходимости. Мы хотим отображать разные столбцы из одной и той же таблицы и одну и ту же запись в виде отдельных строк. Я знаю, что должен быть лучший / более чистый способ. Пожалуйста, сообщите.

SELECT task1 AS Job FROM prevent WHERE task1 != "" AND eq = ? AND id = ? AND pmTask LIKE ?
UNION
SELECT task2 AS Job FROM prevent WHERE task2 != "" AND eq = ? AND id = ? AND pmTask LIKE ?
UNION
SELECT task3 AS Job FROM prevent WHERE task3 != "" AND eq = ? AND id = ? AND pmTask LIKE ?

Вот снимок записи db, показанной ниже. enter image description here enter image description here

1 Ответ

1 голос
/ 29 января 2020

Ваш запрос - лучший способ сделать это.

В MySQL 8.x вы можете использовать CTE для упрощения кода, но, поскольку вы используете 5.6, я не вижу лучший вариант.

Честно говоря, ваша модель базы данных не так уж велика. Он будет поддерживать фиксированное / максимальное количество задач на задание, поскольку они включены в виде столбцов таблицы, а не в виде отношения 1: n с другой таблицей. Этот дизайн будет генерировать гораздо больше работы, каждый раз, когда вам нужно хранить и извлекать данные из него. К сожалению, если вы не измените свою модель, вы мало что можете сделать, чтобы улучшить эти запросы.

РЕДАКТИРОВАТЬ ОТ 29 января 2020 г .:

Из вашего описания вакансий и задачи кажутся двумя разными сущностями. Если это так, вместо того, чтобы использовать одну таблицу для хранения обеих, рекомендуется использовать две.

Например:

create table prevent (
  id int primary key not null,
  eq int,
  eqName varchar(50),
  timeFrame int,
  pmTask varchar(50)
);

create table task (
  prevent_id int primary key not null,
  task_number int,
  name varchar(100),
  constraint fk_task_job1 foreign key (job_id) references prevent (id)
);

insert into prevent (id, eq, eqName, timeFrame, pmTask) 
  values (910, 910, 'Boiler', 90, 'Boiler Quarterly Check');

insert into task (prevent_id, task_number, name) values (910, 1, 'job work tasks');
insert into task (prevent_id, task_number, name) values (910, 2, 'check oil levels');
insert into task (prevent_id, task_number, name) values (910, 3, 'belt tension');

Тогда ваш запрос будет:

select
  t.task_number,
  t.name
from prevent j
join task t on t.prevent_id = j.id
where t.name <> '' 
  and j.id = ?
  and j.pmTask like ?
order by t.task_number
...