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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Requête SQL défaillante.... help me please

par Invité » 27 avr. 2007, 14:04

J'ai fait cette requête et ça à l'air de marcher

Code : Tout sélectionner

SELECT nom_phys, duree, dt_sauv, volume, dt_reboot FROM serveur, sauv_srv_hebdo b, reboot where b.id_srv = serveur.id_srv and reboot.id_srv = serveur.id_srv and b.dt_sauv=(select max(dt_sauv) from sauv_srv_hebdo where sauv_srv_hebdo.id_srv = serveur.id_srv group by id_srv)
Merci beaucoup pour votre aide.

par sadeq » 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)

par Invité » 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...)

par sadeq » 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

par Invité » 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)

par Invité » 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)

par Ryle » 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 :)

par Invité » 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]

par Sékiltoyai » 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.

par sadeq » 27 avr. 2007, 11:13

En principe ta requête de départ est bonne

par Invité » 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'

par sadeq » 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)

par Invité » 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'

par zeus » 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.

par Invité » 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'