Page 1 sur 2

besoin d'aide pour requête SQL

Posté : 22 févr. 2008, 17:49
par [JL]Nikko
Bonjour à tous,

Je fais appel à vous car j'ai une requête sql à effectuer et je n'arrive pas à la rédiger.

Je vous donne en premier lieu mon MRD :

PRODUIT(codeprod, nom, quantite, #codetype)
TYPE(codetype, libelle)
RESERVATION(numero(auto increment), datedépart, dateretour, quantitereserve, #codetype, #codesal)
SALARIE(codesal, nom, prenom)

Ce que je voudrais réaliser avec ma requête, c'est récupérer la "quantitereserve" de la table Réservation et l'ajouter à la "quantite" de la table Produit lorsque la "dateretour" de Réservation n'est pas nulle...

J'utilise une base de données Mysql, la plus récente.


Je vous remercie par avant,
Nikko

Posté : 22 févr. 2008, 23:21
par Patriboom
Je tente ma chance avec ce que je comprends de ta demande et les quelques notions que j'ai en MySQL.
PRODUIT(codeprod, nom, quantite, #codetype)
TYPE(codetype, libelle)
RESERVATION(numero(auto increment), datedépart, dateretour, quantitereserve, #codetype, #codesal)
SALARIE(codesal, nom, prenom)

Ce que je voudrais réaliser avec ma requête, c'est récupérer la "quantitereserve" de la table Réservation et l'ajouter à la "quantite" de la table Produit lorsque la "dateretour" de Réservation n'est pas nulle...
$requete  = "SELECT PRODUIT.quantite AS qteProd, ";
$requete .= "(SELECT SUM(quantitereserve) FROM RESERVATION WHERE dateretour != '' GROUP BY dateretour) as qteReserv,  ";
$requete .= "SUM(qteProd, qteReserv)  ";
$requete .= "FROM PRODUIT as PRODUIT";
J'espère que les experts MySQL mettrons leur grain de sel et corrigerons.

Posté : 25 févr. 2008, 09:56
par Invité
Je te remercie de ta réponse et du temps que tu m'as consacré. Je vais essayer cette requête et te dire si elle fonctionne ou pas :wink:

Nikko

Posté : 25 févr. 2008, 10:06
par Invité
A priori, il y aurai une erreur de syntaxe dans la requête.

==> You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' qtereserv) from produit as produit' at line 1

Posté : 25 févr. 2008, 10:31
par Cyrano
La fonction SQL SUM() attend un seul paramètre qui peut être sous la forme d'une expression genre SUM(col1 + col2) par exemple, mais certainement pas SUM(col1, col2) où on voit deux paramètres. :-k

Posté : 25 févr. 2008, 10:36
par Invité
Merci, je rééssaie ca de suite !

Posté : 25 févr. 2008, 10:42
par Invité
quand je change la virgule en '+', il me met une erreur comme quoi 'qteprod' n'existe pas... voici ma requête caractère pour caractère :

select produit.quantite as qteprod, (select sum(quantiteres) from reservation where dateretour is not null group by dateretour) as qteres, sum(qteprod + qteres) from produit as produit;

Ce que je ne comprends pas dans cette requête c'est que l'allias "qteres" ne fait pas parti de la table produit, or, dans la "requête globale", on ne sélectionne que la table produit. Et je ne comprends pas pourquoi on lui accorde un allias (... from produit as produit).

Posté : 26 févr. 2008, 07:28
par Patriboom
Ceci ne me donne pas d'erreur, c'est donc une piste de faisabilité:

Code : Tout sélectionner

SELECT PRODUIT.quantite AS qteProd, SUM(PRODUIT.quantite + (SELECT SUM(quantitereserve) FROM nikko_reservation WHERE dateretour != '' GROUP BY dateretour) ) FROM nikko_produit as PRODUIT GROUP BY PRODUIT.codeprod
Je n'ai pas de données dans mes tables, je n'obtiens donc pas de résultats.
Présente-nous tes bases en code MySQL (CREATE TABLE) et donne-nous quelques données (INSERT ) pour que nous puissions t'aider.

Posté : 26 févr. 2008, 07:29
par Patriboom
Ceci ne me donne pas d'erreur, c'est donc un indice de faisabilité:

Code : Tout sélectionner

SELECT PRODUIT.quantite AS qteProd, SUM(PRODUIT.quantite + (SELECT SUM(quantitereserve) FROM reservation WHERE dateretour != '' GROUP BY dateretour) ) FROM produit as PRODUIT GROUP BY PRODUIT.codeprod
Je n'ai pas de données dans mes tables, je n'obtiens donc pas de résultats.
Présente-nous tes bases en code MySQL (CREATE TABLE) et donne-nous quelques données (INSERT ) pour que nous puissions t'aider.

Posté : 26 févr. 2008, 10:46
par Invité
Voici ma base de données :
TABLE RESERVATION :

create table reservation(numero int auto_increment, datedepart date, dateretour date, quantiteres int, codesal varchar(10),
 codetype varchar(10), codeprod varchar(10), primary key(numero), foreign key(codesal) references salarie(codesal), foreign key(codetype)
 references type(codetype), foreign key(codeprod) references produit(codeprod));


insert into reservation(datedepart, dateretour, quantiteres, codesal, codetype, codeprod) values ('2008/02/14', null, 2, 's001', 'pcp', 'pcp1');



TABLE PRODUIT :

create table produit(codeprod varchar(10), modele varchar(10), marque varchar(30), quantite int, codetype varchar(10), primary key(codeprod), foreign key(codetype) references type(codetype));

insert into produit(codeprod, modele, marque, quantite, codetype) values ('pcp1', 'Inspiron 9400', 'Dell', 12, 'pcp');





TABLE SALARIE :

create table salarie(codesal varchar(10), nom varchar(50), prenom varchar(50), primary key(codesal));

insert into salarie(codesal, nom, prenom) values('s001', 'Dupont', 'Claude');


TABLE TYPE :

create table type(codetype varchar(10), libelle varchar(50), primary key(codetype));

insert into type(codetype, libelle) values('pcp', 'Ordinateur portable');
Je vous remercie encore du temps que vous m'accordez.

Posté : 26 févr. 2008, 11:04
par Invité
Je viens de tester ta requête Patriboom. Elle fonctionne, mais je pense qu'il faut que je rajoute un critère dans la clause WHERE car quand j'exécute la requête, il m'ajoute à toutes les quantité de la table produit la quantité du produit retourné. Je pense donc qu'il faut que je précise le code du produit retourné.

Posté : 26 févr. 2008, 11:10
par Invité
Je viens de rajouter une ligne de données dans ma table réservation. J'ai désormais 2 réservations qui ont une dateretour différente de null. La requête ne fonctionne plus car la sous requête retourne plusieurs résultats et ça ne plaît pas à MySql...

Posté : 26 févr. 2008, 20:03
par Patriboom
Dans un tel cas, ça dépasse mes compétences.

Pour contourner le problème, je passerais donc par une série de requêtes encadrées par un WHILE ... fetch de la sous-requête transformée en requête principale. En cas, ça voudrait dire quelque chose comme:
$requete_RESERV = "SELECT SUM(quantitereserve) FROM reservation WHERE dateretour != '' GROUP BY dateretour";
$resultats_RESERV = mysql_query($requete1, $db);

WHILE ($Quel_RESERV =  mysql_fetch_object($resultats_RESERV) {
     $requete_PROD  = "SELECT PRODUIT.quantite AS qteProd,   ";
     $requete_PROD .= "SUM(PRODUIT.quantite + ".$Quel_RESERV." ) as somme   ";
     $requete_PROD .= "FROM produit as PRODUIT  ";
     $requete_PROD .= "GROUP BY PRODUIT.codeprod ";
     $resultats_RESERV = mysql_query($requete_PROD, $db);
     $Valeur_utilisable[] = mysql_fetch_object($resultats_RESERV);
}

Tu peux alors travailler avec le tableau de données $Valeur_utilisable qui aura les valeurs suivantes:

$Valeur_utilisable[0]->qteProd = (valeur)
$Valeur_utilisable[0]->somme = (valeur)
$Valeur_utilisable[1]->qteProd = (valeur)
$Valeur_utilisable[1]->somme = (valeur)
...


J'espère la réponse d'autres plus compétents pour en apprendre moi aussi.

Posté : 26 févr. 2008, 20:28
par Cyrano
C'est le GROUP BY dans ta sous-requête qui ruine tout. D'autre part, tu compares en faisant ".. != '' .. ce qui au passage devrait en SQL standard s'écrire ".. <> '' .." , mais NULL est différent de "chaine vide. Donc on utilisera "IS NOT NULL".

J'ai procédé à un test avec un jeu d'essai comprenant plus de données dans la table "reservation" :

Code : Tout sélectionner

mysql> SELECT * FROM reservation; +--------+------------+------------+-------------+---------+----------+----------+ | numero | datedepart | dateretour | quantiteres | codesal | codetype | codeprod | +--------+------------+------------+-------------+---------+----------+----------+ | 1 | 2008-02-14 | NULL | 2 | s001 | pcp | pcp1 | | 2 | 2008-02-15 | NULL | 2 | s001 | pcp | pcp1 | | 3 | 2008-02-15 | 2008-02-28 | 5 | s001 | pcp | pcp1 | | 4 | 2008-02-16 | 2008-02-29 | 3 | s001 | pcp | pcp1 | +--------+------------+------------+-------------+---------+----------+----------+ 4 rows in set (0.00 sec)
Là où la date retour n'est pas nulle, j'ai un total de huit articles, je devrais donc obtenir 12 + 8 = 20 articles :

Code : Tout sélectionner

mysql> SELECT -> PRODUIT.quantite AS qteProd, -> SUM(PRODUIT.quantite + ( -> SELECT SUM(quantiteres) -> FROM reservation -> WHERE dateretour IS NOT NULL -> ) -> ) as total -> FROM produit as PRODUIT -> GROUP BY PRODUIT.codeprod; +---------+-------+ | qteProd | total | +---------+-------+ | 12 | 20 | +---------+-------+ 1 row in set (0.00 sec)

Posté : 26 févr. 2008, 21:49
par Patriboom
Tu vois ... je n'aurais jamais pensé à IS NOT NULL, car je n'ai jamais eu à l'utiliser. J'en connaissais l'existence sans plus. Merci Cyrano