3

我正在学习 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 行,为什么?

4

1 回答 1

12

原始查询称为相关子查询。子查询中的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
于 2013-02-28T21:22:19.120 回答