besoin d'aide pour requête SQL

[JL]Nikko
Invité n'ayant pas de compte PHPfrance

22 févr. 2008, 17:49

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

Mammouth du PHP | 881 Messages

22 févr. 2008, 23:21

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.
Soyez artisans de paix

Invité
Invité n'ayant pas de compte PHPfrance

25 févr. 2008, 09:56

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

Invité
Invité n'ayant pas de compte PHPfrance

25 févr. 2008, 10:06

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

Mammouth du PHP | 19672 Messages

25 févr. 2008, 10:31

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
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

25 févr. 2008, 10:36

Merci, je rééssaie ca de suite !

Invité
Invité n'ayant pas de compte PHPfrance

25 févr. 2008, 10:42

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

Mammouth du PHP | 881 Messages

26 févr. 2008, 07:28

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.
Soyez artisans de paix

Mammouth du PHP | 881 Messages

26 févr. 2008, 07:29

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.
Soyez artisans de paix

Invité
Invité n'ayant pas de compte PHPfrance

26 févr. 2008, 10:46

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.

Invité
Invité n'ayant pas de compte PHPfrance

26 févr. 2008, 11:04

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

Invité
Invité n'ayant pas de compte PHPfrance

26 févr. 2008, 11:10

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

Mammouth du PHP | 881 Messages

26 févr. 2008, 20:03

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.
Soyez artisans de paix

Mammouth du PHP | 19672 Messages

26 févr. 2008, 20:28

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)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 881 Messages

26 févr. 2008, 21:49

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
Soyez artisans de paix