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);

しかし、私の出力はエラーです。サブクエリは複数の行を返します。なぜですか?

4

1 に答える 1

12

元のクエリは、相関サブクエリと呼ばれます。サブクエリのWHERE句は、見つかった最大数を、外側のクエリによって処理されている行に一致する記事だけに制限します。

クエリにはWHERE句がないため、テーブル内のすべてが処理されます。次に、性別ごとにグループ化された結果を返します。テーブルには 2 つの性別があると想定しているため、男性の最大値を含む 1 つの行と、女性の最大値を含む別の行が返されます。ただし、単一の値でのみ使用できる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 に答える