Я пытаюсь получить последние x записей из дочерней сущности (сначала по порядку), где, например, del = 0, но либо запрос медленный с обходными путями, либо упорядочение игнорируется.
Пример данных :
create table child (
id int unsigned not null auto_increment primary key,
name varchar(20) not null default '',
parent_id int unsigned not null,
category_id tinyint unsigned not null,
del tinyint(1) unsigned not null default 0,
index idx_parent(parent_id)
);
create table parent (
id int unsigned not null auto_increment primary key,
name varchar(20) not null default ''
);
create table category (
id tinyint unsigned not null auto_increment primary key,
name varchar(20) not null default ''
);
insert into category (name) values ('A'), ('B'), ('C');
insert into parent (name) values ('Father'), ('Mother'), ('Grand-Father'), ('Grand-Mother');
insert into child(name, parent_id, category_id) values
('Kid', 1, 2), ('Infant', 3, 1), ('Teen', 2, 3), ('Boy', 1, 1),('Girl', 3, 2);
Запрос:
select * from (
select * from child
# workaround 1 (slowing down the query)
# group by id
order by id desc
) ch
inner join parent p on p.id = ch.parent_id
inner join category c on c.id = ch.category_id
where ch.del = 0
# workaround 2 (slowing down the query)
# order by ch.id desc
limit 10
Смотрите ссылку db-fiddle .
Не используйте del = 0 в подзапросе, потому что он не индексируется, и лучше сначала упорядочить его по первичному индексу, а затем выполнить фильтрацию, поскольку значение 99,9% del = 0 будет равно true.