Récupération avec deux tables

Eléphant du PHP | 60 Messages

04 oct. 2007, 12:34

Hello

Je cherche un moyen de récupérer une liste de PC qui est dans une table (all_pc_list), mais dans l'ordre selon une autre table :

table all_pc_list contient un champs 'pcname', par exemple :
U800000
U800001
U800002
U800003
...

et l'autre table est nommée "exceptions", elle a aussi un champs 'pcname'. Les lignes contenues dans cette table ont pour valeur 'pcname', un 'pcname' de "all_pc_list".

Ce que je veux faire, c'est récupérer tout les 'pcname' de "all_pc_list", mais ordrer en affichant ceux qui sont aussi présents dans "exceptions".

C'était assez clair?


Merci d'avance! :)

Eléphant du PHP | 443 Messages

04 oct. 2007, 12:54

Tu n'as pas donné la structure de la table exceptions, donc je vais partir du principe qu'elle peut contenir plusieurs exceptions pour un pcname et que tu tries sur la date de dernière exception par exemple:

Code : Tout sélectionner

select p.name, [autres champs de p] from all_pc_list p inner join ( select pcname, max(dt) as d from exceptions group by pcname ) e on p.pcname = e.pcname order by e.d desc
si le principe n'est pas bon ou que ton serveur sql ne supporte pas les requêtes imbriquées, reposte

Eléphant du PHP | 60 Messages

05 oct. 2007, 08:11

Merci pour ta réponse!

Mais en adaptant ta requête ainsi :

Code : Tout sélectionner

select p.pcname from all_pc_list p inner join ( select pcname, max(pcname) as d from exceptions group by pcname ) e on p.pcname = e.pcname order by e.d desc
J'obtiens seulement les pcname contenus dans la table "exceptions", mais affiché seulement une fois. Ce que j'aimerais au final. c'est.... un peu le contraire. Afficher tout le contenu de "all_pc_list" mais en priorité ceux figurant dans "exceptions".

Désolé si cela n'avait pas été clair, ou peut-être que j'ai moi-même mal adapté ton code. Et si jamais, dans mes deux tables, les autres champs m'importes peu pour cette requête, seulement le champ pcname (même nom de champs dans les deux tables).


Merci beaucoup !

Eléphant du PHP | 443 Messages

05 oct. 2007, 08:23

Merci pour ta réponse!

Mais en adaptant ta requête ainsi :

Code : Tout sélectionner

select p.pcname from all_pc_list p inner join ( select pcname, max(pcname) as d from exceptions group by pcname ) e on p.pcname = e.pcname order by e.d desc
J'obtiens seulement les pcname contenus dans la table "exceptions", mais affiché seulement une fois. Ce que j'aimerais au final. c'est.... un peu le contraire. Afficher tout le contenu de "all_pc_list" mais en priorité ceux figurant dans "exceptions".

Désolé si cela n'avait pas été clair, ou peut-être que j'ai moi-même mal adapté ton code. Et si jamais, dans mes deux tables, les autres champs m'importes peu pour cette requête, seulement le champ pcname (même nom de champs dans les deux tables).


Merci beaucoup !
La modif que tu as apportée: pcname, max(pcname) ne sert pas à grand chose parce qu'avec le group by pcname == max(pcname)...

Si tu veux faire apparaitre en premier les pcname ayant des exceptions on peut trier par nombre d'exceptions décroissant:

Code : Tout sélectionner

select p.pcname from all_pc_list p inner join ( select pcname, count(*) as d from exceptions group by pcname ) e on p.pcname = e.pcname order by e.d desc, p.pcname asc
e.d étant dans ce cas le nombre d'exceptions par pcname.

Eléphant du PHP | 60 Messages

05 oct. 2007, 08:29

Hello !

Merci pour ta réponse. J'ai testé ce que tu m'as montré mais j'obtiens une erreur.

Mais entre temps j'ai un peu bricoler et j'ai obtenu ce que je désirais, il me fallait simplement faire left join :

Code : Tout sélectionner

select p.pcname from all_pc_list p left join ( select pcname, max(pcname) as d from exceptions group by pcname ) e on p.pcname = e.pcname order by e.d desc
Peut-être que ce que tu m'expliquais était mieux mais je pense me contenter de ceci... puisque ça fonctionne :D

Merci quand même!

a+

Eléphant du PHP | 443 Messages

05 oct. 2007, 08:33

Oui désolé, certains pcname n'ont pas d'exception...
a+

[edit]
si ça te convient alors vire [max(pcname) as d] et fait l'order by sur [e.pcname]