mysql sous-requête où et par groupe
Je suis de l'apprentissage manuel mysql:
http://dev.mysql.com/doc/refman/5.6/en/example-maximum-column-group-row.html
et je suis confondu avec le "où.s1.article = s2.l'article " une partie, qu'est-ce que cela signifie?
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 |
+---------+--------+-------+
Je suis en train d'écrire le même code:
SELECT sex, name, birthday
From user
Where birthday=(SELECT MAX(birthday)
FROM user
group by sex);
Mais mine de sorties de l'erreur: une sous-requête de retour de plus de 1 ligne, pourquoi?
- Je ne suis pas sûr, j'ai peut-être tort, mais je pense que c'est parce que
subquery returns more than 1 row
.
Vous devez vous connecter pour publier un commentaire.
La requête d'origine est appelé un sous-requête corrélée. Le
WHERE
clause dans la sous-requête limite le maximum trouvé juste l'article qui correspond à la ligne en cours de traitement par la requête externe.Dans votre requête, vous n'avez pas de
WHERE
clause, afin qu'il traite tout dans la table. Il renvoie ensuite les résultats regroupés par sexe. Je suppose il y a deux sexes dans votre tableau, de sorte qu'il renvoie une ligne avec le maximum pour les hommes, et une ligne contenant le maximum pour les femmes. MaisWHERE price = (<subquery>)
nécessite la sous-requête pour renvoyer simplement un résultat unique, parce que=
ne peut être utilisé avec des valeurs uniques.Vous pouvez utiliser
IN
au lieu de=
de match contre plusieurs valeurs renvoyées. Ce n'est probablement pas ce que vous voulez, mais vous n'avez pas décrit ce que vous voulez que votre requête à faire, c'est difficile à dire.Pour obtenir la personne la plus jeune de chaque sexe, vous pouvez écrire une sous-requête corrélée, comme celui dans le manuel:
ou vous pouvez utiliser une jointure avec un groupe de sous-requête:
=
nécessite juste une chose à comparer. Si vous voulez comparer, vous devez utiliser unWHERE
clause.