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

Petit nouveau ! | 9 Messages

27 avr. 2007, 08:12

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.

Invité
Invité n'ayant pas de compte PHPfrance

27 avr. 2007, 10:08

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'

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 avr. 2007, 10:44

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.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Invité
Invité n'ayant pas de compte PHPfrance

27 avr. 2007, 11:04

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'

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

27 avr. 2007, 11:06

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)
Modifié en dernier par sadeq le 27 avr. 2007, 11:12, modifié 1 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Invité
Invité n'ayant pas de compte PHPfrance

27 avr. 2007, 11:10

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'

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

27 avr. 2007, 11:13

En principe ta requête de départ est bonne
Modifié en dernier par sadeq le 27 avr. 2007, 11:17, modifié 2 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

ViPHP
ViPHP | 5924 Messages

27 avr. 2007, 11:15

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.

Invité
Invité n'ayant pas de compte PHPfrance

27 avr. 2007, 11:28

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]

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 avr. 2007, 11:41

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

27 avr. 2007, 11:49

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)

Invité
Invité n'ayant pas de compte PHPfrance

27 avr. 2007, 11:58

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)

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

27 avr. 2007, 12:07

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
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Invité
Invité n'ayant pas de compte PHPfrance

27 avr. 2007, 12:21

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

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

27 avr. 2007, 14:00

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)
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène