[英]Mysql Using Result of Subquery in Main Query
基本上,我想做的是在某個出生年份將所有孩子放到另一個桌子上。 所以我有兩個桌子。 假設這是一張學校桌子
學校
school_id
child_id
孩童
child_id
birth_year
name
etc
我的第一次嘗試是使用子查詢,就像這樣
SELECT *, (SELECT COUNT(*) FROM school LEFT JOIN children ON school.child_id = children.child_id) as total FROM school LEFT JOIN children ON school.child_id = children.child_id GROUP BY birth_year
該查詢的問題是子查詢將在整個記錄中運行,因此,如果我有1000條記錄,我認為查詢(和子查詢)將在按birth_year分組之前運行1000次,這很慢,幾乎是3-5秒用於500個樣本數據。
因此,為了優化它,我正在這樣做。
使用PHP進行遞歸查詢
首先,獲得所有在校兒童的不同出生年份。 所以我要查詢類似
SELECT birth_year FROM school LEFT JOIN children ON school.child_id = children.child_id
它會像
birth_year
==========
2009
2010
2011
我將在PHP的另一個查詢中使用它(假設我將結果存儲在$ row變量中)
foreach ($row as $r){
$new_array[] = count($this->db->get_child_data($r->birth_year)); //this is pseudocode only, to get the number of children data who have birth_year of 2009-2011
}
盡管它將運行另外三個查詢,但是由於計數很簡單,因此這確實非常快。 500個樣本數據只需不到0.5秒的時間。
但是,我想知道是否有任何優化方法? 還是更好,有沒有辦法在性能相似的單個查詢中做到這一點?
我正在嘗試執行此操作,但最終速度非常慢,並使WAMP崩潰。
SELECT * FROM children WHERE birth_year IN (SELECT GROUP_CONCAT(DISTINCT birth_year) FROM school LEFT JOIN children ON school.child_id = children.child_id )
子查詢
SELECT GROUP_CONCAT(DISTINCT birth_year) FROM school LEFT JOIN children ON school.child_id = children.child_id
正確分開運行並快速返回時
2009,2010,2011
當我查詢
SELECT * FROM children WHERE birth_year IN (2009,2010,2011)
它也可以快速運行,所以我很困惑為什么當我同時加入兩個查詢時,它會很慢地導致WAMP崩潰。
對不起,很長的帖子,在此先感謝
問題在於,在IN
或SELECT
子句中使用子查詢通常會使它們針對外部查詢中的每一行再次運行。 為了避免這種情況,請嘗試加入子查詢。 這將導致子查詢僅運行一次並被緩存。
SELECT c.*
FROM children c, (SELECT birth_year FROM school LEFT JOIN children ON school.child_id = children.child_id GROUP BY birth_year) b
WHERE c.birth_year = b.birth_year
就是說,看來您反正讓每個孩子都在任何學校,所以簡單的JOIN可能也會給您相同的結果。
SELECT c.*
FROM children c, school s
WHERE c.child_id = s.child_id
如果您只想獲取每所出生年份每所學校的孩子人數
SELECT count(c.child_id), s.*
FROM school s
LEFT JOIN children c ON c.child_id = s.child_id
GROUP BY s.school_id, c.birth_year
如果您想獲取出生年份的孩子數
SELECT COUNT (c.child_id) FROM child c INNER JOIN school s ON (c.child_id = s.child_id) GROUP BY birthyear
如果需要其他過濾器,則可以添加所需年份的where子句
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.