2012-04-01 75 views
1

做到这一点没有限制我有两个表SQL如何在子查询

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

ChildparentParent的外键。 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个孩子,并且不起作用。第二个试图带着父母只有一个孩子(这意味着最近的),它的工作,但需要半分钟跑步。

任何人都可以请告诉我如何使第一个工作或第二个工作快?

结果集的定义有点灵活。理想情况下,将完全ñ结果(在第一个版本,如果父母一方有ň孩子这是全球范围内最近期的,只会有一个结果),所以第二个是在这个意义上说好,但我会接受其他妥协。

+0

最近上传的孩子的顺序将是一个日期范围会是没有,那么一个简单连接回到父母。上传的最后上传的孩子的父母)将仅仅是至少有一个上传的孩子的所有父母。没有达到你想要的水平,也许有一些样本数据和预期结果会成为问题的补充。 – 2012-04-01 14:54:53

+0

我曾经做过一个子表的'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

回答

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