1
做到这一点没有限制我有两个表SQL如何在子查询
Parent: id INT, name VARCHAR, ...
Child: parent INT, uploaded TIMESTAMP, ...
Child
。 parent
是Parent
的外键。 id
并且父母可能有任何数量的孩子。
我试图运行一个查询来查找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
第一个t要采取最近n个孩子,并且不起作用。第二个试图带着父母只有一个孩子(这意味着最近的),它的工作,但需要半分钟跑步。
任何人都可以请告诉我如何使第一个工作或第二个工作快?
结果集的定义有点灵活。理想情况下,将完全ñ结果(在第一个版本,如果父母一方有ň孩子这是全球范围内最近期的,只会有一个结果),所以第二个是在这个意义上说好,但我会接受其他妥协。
最近上传的孩子的顺序将是一个日期范围会是没有,那么一个简单连接回到父母。上传的最后上传的孩子的父母)将仅仅是至少有一个上传的孩子的所有父母。没有达到你想要的水平,也许有一些样本数据和预期结果会成为问题的补充。 – 2012-04-01 14:54:53
我曾经做过一个子表的'INNER JOIN',其中'timestam_field =(SELECT MAX(timestamp)FROM child_table WHERE parent_id = p.id'并且由于速度很慢,我决定在子表上有一个'ON INSERT'触发器使用来自子表的数据更新父表中的列,这样就避免了聚合函数或子查询的需要,因为您基于父表中的该列来加入子表(无论它是孩子的ID还是孩子的TIMESTAMP无关紧要)。基本上,我建议改变你的桌子,我不知道你是否能够/愿意这样做。 – 2012-04-01 15:09:36