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
下面的 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