我有两张桌子
Parent: id INT, name VARCHAR, ...
Child: parent INT, uploaded TIMESTAMP, ...
Child
。parent
是Parent
。id
的外键,父母可能有任意数量的子项。
我正在尝试运行查询以查找包含最近上传的子项的 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 子项,这些子项是全局最新的,则只有一个结果)所以第二个在这个意义上,一个人更好,但我会接受其他妥协。
答案 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