Ваш запрос - лучший способ сделать это.
В 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