我正在学习mysql手册: http://dev.mysql.com/doc/refman/5.6/en/example-maximum-column-group-row.html 而且我对“where.s1.article = s2.article”部分感到困惑,这是什么意思?
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行,为什么?
答案 0 :(得分:6)
原始查询称为相关子查询。子查询中的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