2012-04-01 71 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