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