簡體   English   中英

Mysql在主查詢中使用子查詢的結果

[英]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崩潰。

對不起,很長的帖子,在此先感謝

問題在於,在INSELECT子句中使用子查詢通常會使它們針對外部查詢中的每一行再次運行。 為了避免這種情況,請嘗試加入子查詢。 這將導致子查詢僅運行一次並被緩存。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM