SQL如何在子查询中没有LIMIT的情况下执行此操作

时间:2012-04-01 14:28:33

标签: mysql sql

我有两张桌子

Parent: id INT, name VARCHAR, ...
Child:  parent INT, uploaded TIMESTAMP, ...

ChildparentParentid的外键,父母可能有任意数量的子项。

我正在尝试运行查询以查找包含最近上传的子项的 n 父行。我愿意稍微捏造这个定义以使其快速(考虑只有父母可能有一个孩子,或者找到 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 :(得分:0)

你能不能简单地按照上次上传的孩子的顺序找到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