MySQL 5.6 SELECT 联合查询

MySQL 5.6 SELECT UNION Query

下面的 SELECT UNION 查询会根据需要运行。 我们希望将来自相同 table 和相同条目的不同列显示为单独的行。 我知道必须有更好/更清洁的方法。 请指教

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 ?

下面是数据库条目的快照。

您的查询实际上是最好的查询方式。

在 MySQL 8.x 中,您可以使用 CTE 来简化代码,但由于您使用的是 5.6,我看不到更好的选择。

老实说,您的数据库模型不是很好。它将支持每个作业的 fixed/maximum 个任务,因为它们被包含为 table 的列,而不是与另一个 table 的 1:n 关系。每次您需要从中存储和检索数据时,这种设计都会产生更多的工作。遗憾的是,除非您更改模型,否则您几乎无法改进这些查询。

2020 年 1 月 29 日编辑:

根据您的描述,工作和任务似乎是两个不同的实体。如果是这种情况,与其使用单个 table 来存储它们,不如使用两个。

例如:

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