Page 1 sur 2

Requête SQL défaillante.... help me please

Posté : 27 avr. 2007, 08:12
par billy1377
Bonjour,

j'ai quelques petits soucis avec ma requête SQL. Très rapidement je vais tentez de vous expliquer ce problème.

Je fais un intranet (IIS / php / mysql)

J'ai 3 tables

Code : Tout sélectionner

reboot (avec les champs #id_srv et #dt_reboot) serveur (avec les champs #id_srv, nom_phys...le reste n'est pas important) sauv_srv_jour (#id_srv, #dt_sauv, volume, duree, dt_log)

J'ai fait la requête suivante :

Code : Tout sélectionner

SELECT nom_phys, duree, dt_sauv, volume, dt_reboot FROM serveur, sauv_srv_jour a, reboot where sauv_srv_jour.id_srv = serveur.id_srv and reboot.id_srv = serveur.id_srv and reboot.dt_reboot=(select max(dt_reboot) from reboot r where a.id_srv = r.id_srv group by id_srv)

et j'obtiens l'erreur suivante : :(

Code : Tout sélectionner

Unknown column 'sauv_srv_jour.id_srv' in 'where clause'
Pouvez-vous m'aider svp ? :oops:

Merci d'avance.

Posté : 27 avr. 2007, 10:08
par Invité
J'ai essayé cette requête aussi mais rien n'y fait

Code : Tout sélectionner

SELECT nom_phys, duree, dt_sauv, volume, dt_reboot, (select max(dt_reboot) from reboot r where a.id_srv = r.id_srv group by r.id_srv) as dtmax FROM serveur, sauv_srv_jour a, reboot where sauv_srv_jour.id_srv = serveur.id_srv and reboot.id_srv = serveur.id_srv and reboot.dt_reboot = dtmax
Erreur :

Code : Tout sélectionner

Unknown column 'sauv_srv_jour.id_srv' in 'where clause'

Posté : 27 avr. 2007, 10:44
par zeus
Le message d'erreur indique qu'il ne connait pas le champ "id_srv" de la table "sauv_srv_jour". La description de tes tables tente à dire qu'il s'y trouve pourtant. :-k

Essaye de regarder si tu n'as pas de différences entre le nom du champ et le nom dans la requête.

Posté : 27 avr. 2007, 11:04
par Invité
J'ai toujours le même message avec la requête que tu m'as donné
:(


Unknown column 'sauv_srv_jour.id_srv' in 'where clause'

Posté : 27 avr. 2007, 11:06
par sadeq
Tu dois mettre "a.id_srv" au lieu de "sauv_srv_jour.id_srv" car la table sauv_srv_jour a un alias

C'est à dire:

Code : Tout sélectionner

SELECT nom_phys, duree, dt_sauv, volume, dt_reboot FROM serveur, sauv_srv_jour a, reboot where a.id_srv = serveur.id_srv and reboot.id_srv = serveur.id_srv and reboot.dt_reboot=(select max(dt_reboot) from reboot r where a.id_srv = r.id_srv group by id_srv)

Posté : 27 avr. 2007, 11:10
par Invité
Ca a marché l'alias mais par contre il y a une autre erreur cette fois sur le dtmax
:(
Unknown column 'dtmax' in 'where clause'

Posté : 27 avr. 2007, 11:13
par sadeq
En principe ta requête de départ est bonne

Posté : 27 avr. 2007, 11:15
par Sékiltoyai
Il faut fermer la parenthèse de ta sous requète SELECT, il appréciera un peu plus, et pour nous, ce sera plus lisible.

Posté : 27 avr. 2007, 11:28
par Invité
Effecitivement, sadeq tu as raison, la requête de départ est bonne (bien entendu en tenant compte de ta juste remarque en remplaçant sauv_srv_jour par son alias).

Mais je ne comprends pas, la requête devrait permettre d'afficher une ligne par serveur et pour chacun des serveurs, leur dernière date de reboot (max dt_reboot)

La requête fonctionne mais ce n'est malheureusement pas l'effet escompté.

Voici la requête modifiée :

Code : Tout sélectionner

$sql =mysql_query("SELECT nom_phys, duree, dt_sauv, volume, dt_reboot FROM serveur, sauv_srv_jour a, reboot where a.id_srv = serveur.id_srv and reboot.id_srv = serveur.id_srv and reboot.dt_reboot=(select max(dt_reboot) from reboot r where a.id_srv = r.id_srv group by id_srv)");
[/code]

Posté : 27 avr. 2007, 11:41
par Ryle
Euh bah non.. en l'occurence, la tu vas chercher la dernière date de reboot (max) et tu listes les enregistrement qui ont cette date... donc à moins d'avoir tous rebouté le même jour, tu n'auras qu'un seul résultat :)

Posté : 27 avr. 2007, 11:49
par Invité
Non seulement il ne m'affiche rien dans la colonne reboot (aucune date malgré que celle-ci soit pleine) mais en plus il m'affiche plusieurs lignes concernant le même serveur (durée, volume..)... et je confirme dans ma table reboot, j'ai qu'une date par jour pour chaque serveur (pas plusieurs reboot dans la même journée pour un serveur)

Posté : 27 avr. 2007, 11:58
par Invité
En fait, je m'étais trompé la date de reboot s'affiche à présent par contre, il m'affiche toujours plusieurs lignes concernant le même serveur alors qu'il devrait m'afficher la dernière date de reboot (une seule ligne par serveur et la dernière ligne)

Posté : 27 avr. 2007, 12:07
par sadeq
J'ai une question: c'est quoi la relation entre la date de sauvegarde et de reboot d'un server?

En attendant, vérifie le résultat de la requête avec un regroupement par server et/ou par date de reboot

Code : Tout sélectionner

SELECT nom_phys, duree, dt_sauv, volume, dt_reboot FROM serveur, sauv_srv_jour a, reboot WHERE a.id_srv = serveur.id_srv and reboot.id_srv = serveur.id_srv and reboot.dt_reboot=(select max(r.dt_reboot) from reboot r where a.id_srv = r.id_srv group by r.id_srv) GROUP BY serveur.id_srv, dt_reboot

Posté : 27 avr. 2007, 12:21
par Invité
Je suis sincèrement désolé, il affiche bien ce pourquoi on lui a demandé d'afficher (jusque là c'est normal) mais je me suis mal exprimé / trompé en fait, voilà, je vais tâcher d'être clair, le plus possible.

J'ai plusieurs serveurs qui font une sauvegarde quotidienne (une par jour) du lundi au samedi soir inclus (sauvegarde journalière des données). Une sauvegarde système hebdomadaire (le dimanche soir). Ils rebootent à la suite de la sauvegarde système hebdomadaire.


Je désire affiche dans un intranet, le résultat des sauvegardes (quotidienne et hebdo à part, dans 2 pages différentes).
Afficher
les entête serveurs, date (quand a eu lieu la sauvegarde), volume, durée et enfin la date de reboot du serveur.

Je désire afficher qu'une ligne par serveur (la dernière date de sauvegarde) donc la valeur max plutôt sur dat_sauvegarde que sur le champ dt_reboot (ou alors dt_log qui représente la date de l'entrée de log) ?


Mes tables sont les suivantes pour rappel :

sauv_srv_jour (#id_srv, #dt_sauv, volume, duree, dt_log)
reboot (#id_srv, #dt_reboot)
serveur (#id_srv, nom_phys...)

Posté : 27 avr. 2007, 14:00
par sadeq
Ok, c'est plus clair maintenant, j'étais sûr que c'était la date sauvegarde qui générait le détail.

Il suffit donc de regrouper par serveur et afficher l'information de sauvegarde pour la date qui correspond au max (dernière)

Code : Tout sélectionner

SELECT nom_phys, duree, dt_sauv, volume, dt_reboot FROM serveur, sauv_srv_jour a, reboot WHERE a.id_srv = serveur.id_srv and reboot.id_srv = serveur.id_srv GROUP BY serveur.id_srv HAVING a.dt_sauv = Max(a.dt_sauv)