SQL, как это сделать без LIMIT в подзапросе - PullRequest
1 голос
/ 01 апреля 2012

У меня есть две таблицы

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 детей, которые являются самыми последними в мире, будет только один результат), так что второйлучше в этом смысле, но я приму другие компромиссы.

1 Ответ

0 голосов
/ 01 апреля 2012

Разве вы не можете просто найти n родителей в порядке последних загруженных детей

SELECT p.id,
       MAX(uploaded) AS latest_upload
FROM Parent p
    INNER JOIN Child c ON p.id=c.parent
GROUP BY p.id
ORDER BY latest_upload DESC
LIMIT n
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...