Requete mysql: interroger 2 fois le meme champ ...(array)

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 : Requete mysql: interroger 2 fois le meme champ ...(array)

par guigui69 » 18 juin 2008, 16:07

Merci,

Moi je suis dans ce sens:

Code : Tout sélectionner

$sql1="SELECT matiere.code_m, nom_m, nom_four, cond_m, unite_conditionnement, qte_inventaire_mat as qte_prec FROM matiere LEFT JOIN inventaire_mat ON matiere.code_m = inventaire_mat.code_m INNER JOIN fournisseur ON matiere.id_four = fournisseur.id_four INNER JOIN conditionnement ON conditionnement.id_conditionnement = matiere.id_conditionnement WHERE inventaire_mat.mois_inventaire_mat ='04' AND inventaire_mat.annee_inventaire_mat ='2008' ORDER BY nom_four;"; //echo $sql1; $query1 = mysql_query($sql1) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); $ServArray = array (); while($servicetab= mysql_fetch_array($query1)) { $ServArray[$servicetab['code_m']][0] = $servicetab['code_m']; $ServArray[$servicetab['code_m']][1] = $servicetab['nom_four']; $ServArray[$servicetab['code_m']][2] = $servicetab['cond_m']; $ServArray[$servicetab['code_m']][3] = $servicetab['unite_conditionnement']; $ServArray[$servicetab['code_m']][4] = $servicetab['qte_prec']; } $sql3="SELECT code_m, qte_inventaire_mat as qte FROM inventaire_mat WHERE inventaire_mat.mois_inventaire_mat ='05' AND inventaire_mat.annee_inventaire_mat ='2008' ORDER BY code_m; "; $query3 = mysql_query($sql3) or die('Erreur SQL !'.$sql3.'<br>'.mysql_error()); while($servicetab3= mysql_fetch_array($query3)) { if ($ServArray[$servicetab3['code_m']][0] == $servicetab3['code_m']) { if(isset($servicetab3['qte'])) { $ServArray[$servicetab3['code_m']][5] = $servicetab3['qte']; } else { $ServArray[$servicetab3['code_m']][5] = 0; } } }
Cela te semble correcte?

Merci d'avance pour votre aide.

guigui69

----------------------------------------------------
Maj

J'ai rajouter ceci pour l'affichage de mon tableau array:

Code : Tout sélectionner

echo '<table border="1">'; foreach ($ServArray as $key => $val) { $difference = $val[6] - $val[5]; $ecart = ($val[6] - $val[5])* $val[7]; echo '<tr><td>'.$val[1].'</td><td>'.$val[2].'</td><td>'.$val[3].'</td><td>'.$val[4].'</td><td>'.$val[5].'</td><td>'.$val[6].'</td><td>'.$val[7].'</td><td>'.$difference.'</td><td>'.$ecart.'</td></tr>'; //echo 'test'.$key.'" >'.$val.''; //echo $val[1]; } echo '</table>'
Cela vous semble correcte?
Je préfére demander pour eviter de commettre des erreurs.

Merci

guigui69

par Sékiltoyai » 18 juin 2008, 14:51

Un tableau de ce style :
$tab['2008-02-01'] = array(
   0 => array(/* tes données */),
   1 => array(/* tes données */)
   ....
);
$tab['2008-03-01'] = array(
   0 => array(/* tes données */),
   1 => array(/* tes données */)
   ....
);
etc...
Donc, à chaque lecture d'un enregistrement, prenons que $record est ton enregistrement, tu fais :
$tab[$record['code_m']][] = $record;
En gros, à chaque enregistrement, tu accèdes à l'élément correspondant à la bonne date, tu crées un nouvel élément dans ce tableau, et tu y places tes données. Bien entendu, tu peux gérer, pour chaque date, le sous-tableau différemment…

par guigui69 » 18 juin 2008, 10:18

Bonjour à tous, je revient sur mon sujet car je suis très intéressé par ce que tu me propose "Sékiltoyai" mais je n'ai aucune idée par ou commencer.


Un petit exemple de code, je suis preneur.

Merci d'avance

guigui69

----------------------------
MAJ

Je suis partit sur un tableau array est-ce bien ça?

Je fait deja un premier tableau array j'ajoute mes données et je voudrait rajouter des données juste après car je réalise 2 requêtes.

Comment je doit procéder pour rajouter des donnée en fonction de l'indice ?

Merci d'avance

guigui69

par guigui69 » 27 avr. 2008, 20:41

Ok , mais est -que tu pourrait me donner un bout de code (un exemple) car je voit pas comment coder ca.

Merci pour ton aide

guigui69

-------------------------------------------------------------
Maj
Et pourquoi avoir 1 colonne "mois" et 1 colonne "annee" alors que tu as déjà la date ? Shocked
J'ai rajouter ces 2 champs pour savoir quel mois et l'annee l'inventaire est fait.

par Sékiltoyai » 27 avr. 2008, 20:21

Tu parcours les résultats et pour chaque identifiant (code_m dans ton cas je crois) tu places ceci dans un tableau : à l'indice code_m de ton tableau, tu crées un nouveau tableau avec les bonnes informations.
C'est à dire que à la lecture des résultats, si le mois est 2 et l'année 2008, tu mettras la quantité dans la colonne qte_mois_precedent de ton sous tableau, et si le mois est 3 et l'année 2008, tu le mets dans la colonne qte_mois_actuelle.

par guigui69 » 27 avr. 2008, 18:56

Merci pour ta réponse.

Mais comment faire en php pour que cela m'affiche correctement le résultat?


Car ma table inventaire_mat est comme ceci:

Code : Tout sélectionner

(1, '2008-02-01', 0.00000, 1, 2, 2008, 500000), (59, '2008-02-01', 0.00000, 59, 2, 2008, 5.00000), (60, '2008-02-01', 0.00000, 60, 2, 2008, 5.00000), (61, '2008-02-01', 0.00000, 61, 2, 2008, 5.00000), (62, '2008-03-21', 1.00000, 1, 3, 2008, 4.00000), (63, '2008-03-21', 1.00000, 2, 3, 2008, 4.00000), (64, '2008-03-21', 1.00000, 3, 3, 2008, 0.00000), (65, '2008-03-21', 1.00000, 4, 3, 2008, 0.00000), (66, '2008-03-21', 1.00000, 5, 3, 2008, 0.00000), (67, '2008-03-21', 1.00000, 6, 3, 2008, 0.00000),
Comment faire au niveau de php, pour lui dire de replacer comme ceci les informations de ma base:
nom_m |code_m |four_m |etc...|Qte_mois précédent|qte_mois_actuelle|


Car en php il va m'affiche le résultat de la requête l'un a la suite des autres.

Pourrais-tu m'éclairer pour réaliser ceci ? Un exemple?

Merci d'avance pour ton aide

guigui69

par Sékiltoyai » 26 avr. 2008, 11:37

Ouais, mais à mon avis, si ce n'est que pour cela, tu gagneras du temps à faire une requète plus simple et moins gourmande et réorganiser les résultats en php.
Parce que dans ce cas, il va falloir faire des jointures que je trouve couteuses (à fortiori avec le temps quand tu auras beaucoup d'inventaires), et il faut voir si simplement sélectionner les inventaires des deux derniers mois puis classer les données dans un tableau ne serait pas plus performant. Je te conseillerais donc de faire un bench de ta requète et d'une requète sans jointure pour vérifier que tu ne perds pas un temps important…

par guigui69 » 26 avr. 2008, 10:24

Bonjour à tous merci de m'avoir répondu.

En fait je doit afficher dans ma page web un tableaux html avec les informations du produit (code_m nom_m, etc...) , la quantité de l'inventaire du mois précédent et la quantité du mois actuel.

Donc c'est pour ça que je veut avoir dans le la requête la quantité du mois précédent et celle du mois actuel.

Vous voyer se que je veut dire ?

Comme ceci:

nom_m| code_m| Four_m | qte_mois_precedent | qte_mois_actuel|

Pour que je puisse dans ma page php:

while ($ligne = mysql_fetch_assoc( $query1 ) ) {
 
echo "<tr><td>".$ligne['nom_m']."</td><td>".$ligne['nom_four']."</td><td>".$ligne['cond_m']."".$ligne['unite_conditionnement']."</td><td>".$ligne['pu_m']."</td><td>".$ligne['qte_inventaire_mat actuel']."</td><td>".$ligne['qte_inventaire_mat mois precedent']."</td></tr>";
}
 
Donc avec votre requête je devrait arriver à avoir ces 2 champs sur la meme ligne , je teste ceci lundi.

Merci d'avance

guigui69

par Sékiltoyai » 26 avr. 2008, 02:58

oui, ouckileou, j'ai eu un cracage, j'ai oublié la moitié des conditions de jointure…

par ouckileou » 25 avr. 2008, 16:52

Pourquoi veux-tu absolument les 2 mois dans la même ligne de résultat ? Une ligne par mois se traiterait facilement aussi non ?

Et pourquoi avoir 1 colonne "mois" et 1 colonne "annee" alors que tu as déjà la date ? :shock:


Sekiltoyai, je trouve bizarre les conditions de jointure dans ta requête, c'est du filtrage, par contre tu ne joins pas sur code_m qui relie normalement les deux tables.

Perso, j'aurais fait un truc comme ça :

Code : Tout sélectionner

SELECT code_m, nom_m, Four_m, inv1.qte_inventaire_mat, inv2.qte_inventaire_mat FROM matiere mat INNER JOIN inventaire inv1 ON mat.code_m = inv1.code_m INNER JOIN inventaire inv1 ON mat.code_m = inv2.code_m WHERE inv1.mois_inventaire = <mois> AND inv1.annee_inventaire = <annee> AND inv2.mois_inventaire = <mois_precedent> AND inv2.annee_inventaire = <annee>

par guigui69 » 25 avr. 2008, 12:21

D'accord je corrige ca:


Mysql version 5.

inventaire_mat

Code : Tout sélectionner

-- phpMyAdmin SQL Dump -- version 2.9.1.1-Debian-2ubuntu1 -- http://www.phpmyadmin.net -- -- Serveur: localhost -- Généré le : Vendredi 25 Avril 2008 à 12:15 -- Version du serveur: 5.0.38 -- Version de PHP: 5.2.1 -- -- Base de données: `pdr` -- -- -------------------------------------------------------- -- -- Structure de la table `inventaire_mat` -- CREATE TABLE `inventaire_mat` ( `id_inventaire_mat` int(11) NOT NULL auto_increment, `date_inventaire_mat` date NOT NULL, `qte_inventaire_mat` decimal(10,5) NOT NULL, `code_m` int(11) NOT NULL, `mois_inventaire_mat` int(6) NOT NULL, `annee_inventaire_mat` int(4) NOT NULL, `pu_j_inventaire_mat` decimal(10,5) NOT NULL, PRIMARY KEY (`id_inventaire_mat`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=123 ; -- -- Contenu de la table `inventaire_mat` -- INSERT INTO `inventaire_mat` (`id_inventaire_mat`, `date_inventaire_mat`, `qte_inventaire_mat`, `code_m`, `mois_inventaire_mat`, `annee_inventaire_mat`, `pu_j_inventaire_mat`) VALUES (1, '2008-02-01', 0.00000, 1, 2, 2008, 0.00000), (59, '2008-02-01', 0.00000, 59, 2, 2008, 0.00000), (60, '2008-02-01', 0.00000, 60, 2, 2008, 0.00000), (61, '2008-02-01', 0.00000, 61, 2, 2008, 0.00000), (62, '2008-03-21', 1.00000, 1, 3, 2008, 0.00000), (63, '2008-03-21', 1.00000, 2, 3, 2008, 0.00000), (64, '2008-03-21', 1.00000, 3, 3, 2008, 0.00000), (65, '2008-03-21', 1.00000, 4, 3, 2008, 0.00000), (66, '2008-03-21', 1.00000, 5, 3, 2008, 0.00000), (67, '2008-03-21', 1.00000, 6, 3, 2008, 0.00000),
matiere:

Code : Tout sélectionner

-- Structure de la table `matiere` -- CREATE TABLE `matiere` ( `code_m` int(11) NOT NULL auto_increment, `nom_m` varchar(50) NOT NULL COMMENT 'Nom de la matiere premiere', `id_four` int(11) NOT NULL COMMENT 'fournisseur', `cond_m` int(11) NOT NULL COMMENT 'le nombre de quantité', `id_conditionnement` int(10) NOT NULL COMMENT 'au kg en piece', `pu_m` decimal(10,5) NOT NULL COMMENT 'prix unitaire', `id_conditionnement_pu` int(10) NOT NULL COMMENT 'mesure kg pice rame', `coef_mat_pdr` decimal(10,5) default NULL, `pu_mat_pdr` decimal(10,5) default NULL, `composup25_m` varchar(30) default NULL, `date_m` date NOT NULL COMMENT 'date de maj', `id_matiere_type` int(11) NOT NULL, PRIMARY KEY (`code_m`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=75 ; -- -- Contenu de la table `matiere` -- INSERT INTO `matiere` (`code_m`, `nom_m`, `id_four`, `cond_m`, `id_conditionnement`, `pu_m`, `id_conditionnement_pu`, `coef_mat_pdr`, `pu_mat_pdr`, `composup25_m`, `date_m`, `id_matiere_type`) VALUES (1, 'Eau Fleur Oranger ', 51, 1, 2, 2.70000, 2, 1.00000, 2.70000, '', '2008-01-28', 1), (2, 'Eau Fleur Oranger ', 14, 20, 2, 0.94000, 2, 1.00000, 0.94000, '', '2008-01-28', 1), (3, 'Gouttelines Choco 44%', 10, 25, 1, 1.88000, 1, 0.00000, 0.00000, '', '2008-01-28', 1), (4, 'Palet Choco 44%', 10, 25, 1, 1.82000, 1, 0.00000, 0.00000, '', '2008-01-28', 1), (5, 'Arome Citron', 17, 25, 1, 10.48000, 1, 0.00000, 0.00000, '', '2008-01-28', 1), (6, 'Comte', 13, 10, 1, 8.20000, 1, 1.00000, 8.20000, '', '2008-01-28', 1), (7, 'Roquefort En Des Pot De 500G', 13, 1, 1, 17.42400, 1, 0.00000, 0.00000, '', '2008-01-28', 1), (8, 'Lardons Fumes Supérieurs ', 15, 1, 1, 3.50000, 1, 1.00000, 3.50000, '', '2008-01-28', 1), (9, 'Creme A Froid (Pain Raisin)', 49, 25, 1, 1.50000, 1, 0.00000, 0.00000, '', '2008-01-28', 1), (10, 'Premix Fantaisies', 50, 25, 1, 2.78551, 1, 0.00000, 0.00000, '', '2008-01-28', 1),
Merci

guigui69

par Sékiltoyai » 25 avr. 2008, 12:15

Tu peux imaginer 2 jointures :

Code : Tout sélectionner

SELECT matiere.code_m, …, inv1.qte_inventaire_mat, inv2.qte_inventaire_mat FROM matiere LEFT JOIN inventaire_mat inv1 ON inv1.mois_inventaire = 11 AND inv1.annee_inventaire = 2007 LEFT JOIN inventaire_mat inv2 ON inv2.mois_inventaire = 12 AND inv2.annee_inventaire = 2007
Par contre, du coup, tu dois indiquer les mois et années toi même (je n'ai pas de solution, à fortiori simple, pour te l'éviter)…

par zeus » 25 avr. 2008, 12:13

Modération :
guigui69, afin d'obtenir une réponse sur ce forum, il est indispensable de :

- Préciser quel est le SGBD utilisé ainsi que sa Version
- Poster la Structure des Tables utilisées dans la requête sous la forme d'un "CREATE TABLE ..." :!:
(Vous pouvez exporter la structure d'une table via phpMyAdmin. Retirez les colonnes inutiles)
- Indiquer le message d'erreur SQL le cas échéant.

Pensez à utiliser les balises

Code : Tout sélectionner

pour afficher les requêtes SQL, la Structure des Tables et si nécessaire un échantillon des données. Assurez vous également d'avoir suivi ces [url=http://www.phpfrance.com/forums/voir_sujet-19378.php]conseils de débogage[/url]. [/color]

Requete mysql: interroger 2 fois le meme champ ...(array)

par guigui69 » 25 avr. 2008, 10:38

Bonjour à tous,


J'aurai besoin de savoir comment réaliser ceci (et si c'est possible):


Voici mes tables:
id_inventaire_mat
date_inventaire_mat
qte_inventaire_mat
code_m (cl de la table matiere)
mois_inventaire
annee_inventaire
table matiere
code_m
nom_m
id_four
cond_m
pu_m
id_matiere_type
Je cherche a faire une requête sur ma table inventaire_mat,
Dans ma table inventaire_mat je voudrait récupérer depuis une requête les quantités (qte_inventaire_mat) du mois précédent (mois_inventaire_mat, et année_inventaire_mat) et en même temps les quantité du mois actuelle, sous cette forme:

code_m|nom_m|Four_m|....|qte_inventaire_mat mois précédent| qte_inventaire_mat mois actuelle|

Comment faire au niveau de ma requête mysql pour réaliser ceci?

Merci d'avance pour votre aide.

guigui69