2013-02-28 154 views
0

我學習MySQL手冊: http://dev.mysql.com/doc/refman/5.6/en/example-maximum-column-group-row.html 和我很困惑與「where.s1.article = s2.article」的一部分,這是什麼意思MySQL的子查詢,其中和group by

Task: For each article, find the dealer or dealers with the most expensive price. 

+---------+--------+-------+ 
| article | dealer | price | 
+---------+--------+-------+ 
| 0001 | A  | 3.45 | 
| 0001 | B  | 3.99 | 
| 0002 | A  | 10.99 | 
| 0003 | B  | 1.45 | 
| 0003 | C  | 1.69 | 
| 0003 | D  | 1.25 | 
| 0004 | D  | 19.95 | 
+---------+--------+-------+ 


SELECT article, dealer, price 
FROM shop s1 
WHERE price=(SELECT MAX(s2.price) 
       FROM shop s2 
       WHERE s1.article = s2.article); 

+---------+--------+-------+ 
| article | dealer | price | 
+---------+--------+-------+ 
| 0001 | B  | 3.99 | 
| 0002 | A  | 10.99 | 
| 0003 | C  | 1.69 | 
| 0004 | D  | 19.95 | 
+---------+--------+-------+ 

我試着寫類似的代碼:

SELECT sex, name, birthday 
From user 
Where birthday=(SELECT MAX(birthday) 
       FROM user 
       group by sex); 

但我的輸出錯誤:子查詢返回超過1行,爲什麼

+1

我不確定,我可能是錯的,但我認爲這是因爲'subquery返回多於一行'。 – Sebas 2013-02-28 21:11:34

回答

5

原始查詢?被稱爲相關子查詢。子查詢中的WHERE子句將找到的最大值限制爲僅與外部查詢處理的行匹配的文章。

在您的查詢中,您沒有WHERE子句,因此它處理表中的所有內容。然後返回按性別分組的結果。我假設你的桌子上有兩個性別,所以它返回一行,男性最大,另一行包含女性的最大值。但WHERE price = (<subquery>)要求子查詢僅返回單個結果,因爲=只能與單個值一起使用。

您可以使用IN而不是=來匹配多個返回的值。這可能不是你想要的,但是你沒有描述你想要查詢的內容,所以很難說清楚。

爲了讓每一次性愛的最年輕的人,你可以寫一個相關子查詢,像一個手冊中:

select sex, name, birthday 
from user u1 
where birthday = (select max(birthday) 
        from user u2 
        where u1.sex = u2.sex) 

,或者你可以使用一個分組子查詢聯接:

select u1.sex, name, u1.birthday 
from user u1 
join (select sex, max(birthday) maxbirthday 
     from user 
     group by sex) u2 
on u1.sex = u2.sex and birthday = maxbirthday 
+0

我明白了,謝謝! – nut 2013-02-28 21:26:09

+0

我更新了我的代碼,我只是粘貼了錯誤的代碼,對於看到此帖的任何人都可以清楚。 – nut 2013-02-28 21:37:03

+0

這仍然是同樣的問題。子查詢返回兩個生日,一個爲男性,另一個爲女性。但'='只需要一件事就可以比較。如果你想關聯,你需要使用'WHERE'子句。 – Barmar 2013-02-28 21:39:16