par
Hubert Roksor » 07 oct. 2006, 14:34
Hmm, je ne suis pas trop sûr pour l'auto-jointure sans condition de jointure (pas de JOIN ... ON), j'ai peur que les performances se dégradent de façon exponentielle. Je recommanderais plutôt de le faire en deux requêtes (deux requêtes simples valent souvent mieux qu'une compliqué):
Code : Tout sélectionner
SELECT MAX(pers_id) AS pers_id, COUNT(pers_id) AS total
FROM personnes
puis en utilisant la valeur de
pers_id
Code : Tout sélectionner
SELECT pers_nom, pers_prenom
FROM personnes
WHERE pers_id = 123
Selon ta version de MySQL, Florent, tu peux même les combiner :
Code : Tout sélectionner
SELECT tmp.total, tmp.pers_id, p.pers_nom, p.pers_prenom
FROM (
SELECT MAX(pers_id) AS pers_id, COUNT(pers_id) AS total
FROM personnes
) AS tmp
JOIN personnes AS p USING (pers_id)
Explication : la requête que tu vois entre parenthèse après le FROM est ce qu'on a appelle une "table dérivée". En fait c'est comme si on créait une table temporaire dont le contenu serait le résultat de la requête. Et comme cette table n'a pas de nom, on lui donne un alias avec "AS" (dans notre exemple on l'appelle "tmp"). Tu noteras qu'on a aussi utilisé un alias ("p" dans mon exemple) pour accéder à la table "personnes"... parce que c'est plus court à écrire et à lire
Donc d'un côté on a notre table dérivée qui contient le total des utilisateurs et l'ID de l'utilisateur le plus récent et de l'autre on a la table "personnes", et pour les joindre on utilise le champs "pers_id". [
voir le manuel de JOIN ] [
tutorial sur les jointures SQL ]
Hmm, je ne suis pas trop sûr pour l'auto-jointure sans condition de jointure (pas de JOIN ... ON), j'ai peur que les performances se dégradent de façon exponentielle. Je recommanderais plutôt de le faire en deux requêtes (deux requêtes simples valent souvent mieux qu'une compliqué):
[code]SELECT MAX(pers_id) AS pers_id, COUNT(pers_id) AS total
FROM personnes[/code]
puis en utilisant la valeur de [b]pers_id[/b]
[code]SELECT pers_nom, pers_prenom
FROM personnes
WHERE pers_id = 123[/code]
Selon ta version de MySQL, Florent, tu peux même les combiner :
[code]SELECT tmp.total, tmp.pers_id, p.pers_nom, p.pers_prenom
FROM (
SELECT MAX(pers_id) AS pers_id, COUNT(pers_id) AS total
FROM personnes
) AS tmp
JOIN personnes AS p USING (pers_id)[/code]
Explication : la requête que tu vois entre parenthèse après le FROM est ce qu'on a appelle une "table dérivée". En fait c'est comme si on créait une table temporaire dont le contenu serait le résultat de la requête. Et comme cette table n'a pas de nom, on lui donne un alias avec "AS" (dans notre exemple on l'appelle "tmp"). Tu noteras qu'on a aussi utilisé un alias ("p" dans mon exemple) pour accéder à la table "personnes"... parce que c'est plus court à écrire et à lire :)
Donc d'un côté on a notre table dérivée qui contient le total des utilisateurs et l'ID de l'utilisateur le plus récent et de l'autre on a la table "personnes", et pour les joindre on utilise le champs "pers_id". [ [url=http://dev.mysql.com/doc/refman/5.0/fr/join.html]voir le manuel de JOIN[/url] ] [ [url=http://www.phpfrance.com/forums/voir_sujet-21507.php]tutorial sur les jointures SQL[/url] ]