Page 1 sur 1
Requete mysql: interroger 2 fois le meme champ ...(array)
Posté : 25 avr. 2008, 10:38
par guigui69
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
Posté : 25 avr. 2008, 12:13
par zeus
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]
Posté : 25 avr. 2008, 12:15
par Sékiltoyai
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)…
Posté : 25 avr. 2008, 12:21
par guigui69
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
Posté : 25 avr. 2008, 16:52
par ouckileou
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 ?
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>
Posté : 26 avr. 2008, 02:58
par Sékiltoyai
oui, ouckileou, j'ai eu un cracage, j'ai oublié la moitié des conditions de jointure…
Posté : 26 avr. 2008, 10:24
par guigui69
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
Posté : 26 avr. 2008, 11:37
par Sékiltoyai
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…
Posté : 27 avr. 2008, 18:56
par guigui69
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
Posté : 27 avr. 2008, 20:21
par Sékiltoyai
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.
Posté : 27 avr. 2008, 20:41
par guigui69
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.
Posté : 18 juin 2008, 10:18
par guigui69
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
Posté : 18 juin 2008, 14:51
par Sékiltoyai
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…
Posté : 18 juin 2008, 16:07
par guigui69
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