У меня есть две таблицы
Parent: id INT, name VARCHAR, ...
Child: parent INT, uploaded TIMESTAMP, ...
Child
. parent
- это внешний ключ для Parent
. id
, и может быть любое количество дочерних элементов для родителя.
Я пытаюсь выполнить запрос, чтобы найти строки n Parent с самыми последними загруженными дочерними элементами.Я хочу немного выдумать это определение, чтобы оно было быстрым (возможно, рассмотрим только родителей, у которых, возможно, один ребенок, или найдут родителей n самых последних детей).
Вот, по сути, то, что у меня сейчас
SELECT
...,
(SELECT uploaded
FROM Child C
WHERE C.parent = P.id
HAVING uploaded = MAX(uploaded)
LIMIT 1
) AS date_uploaded
FROM Parent P
WHERE P.id IN (
SELECT parent
FROM Child
ORDER BY uploaded DESC
LIMIT $n
)
ORDER BY date_uploaded DESC
Ничего хорошего: Эта версия MySQL еще не поддерживает подзапрос LIMIT & IN / ALL / ANY / SOME *
Вот что-то, что дает результаты, но работает далеко, слишком медленно (да, все индексируется)
SELECT
...,
(SELECT uploaded
FROM Child C
WHERE C.parent = P.id
ORDER BY uploaded DESC
LIMIT 1)
AS date_uploaded
FROM ...
WHERE P.id IN (
SELECT parent FROM Child
GROUP BY parent
HAVING COUNT(*) = 1
)
ORDER BY date_uploaded DESC
LIMIT $n
Первый пытается взять n самых последних детей и неРабота.Второй пытается взять родителей только с одним ребенком (что подразумевает самое последнее время), он работает, но бегает полминуты.
Может кто-нибудь сказать, пожалуйста, как заставить первого работать или второгоодин быстрый?
Определение набора результатов немного гибкое.В идеале это будет точно n результатов (в первой версии, если у одного из родителей есть n детей, которые являются самыми последними в мире, будет только один результат), так что второйлучше в этом смысле, но я приму другие компромиссы.