Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/11/2010, 19h08   #1
Invité régulier
 
Inscription : août 2010
Messages : 24
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 24
Points : 8
Points : 8
Par défaut "sauter" un enregistrement avec une boucle

Bonjour,

c'est encore moi le nb du php

et j'ai encore une question existentielle à laquelle je ne trouve pas de réponse...

J'ai boucle pour générer un tableau qui fonctionne parfaitement (en presque...) qui utilise la requete suivante.

Code :
1
2
3
4
5
mysql_select_db($database_cosmetiques, $cosmetiques);
$query_a_commander = "SELECT * FROM production, associations_produits, produits WHERE production.suivi = 'A commander' AND production.id_recette = associations_produits.id_recette AND associations_produits.id_produit = produits.id";
$a_commander = mysql_query($query_a_commander, $cosmetiques) or die(mysql_error());
$row_a_commander = mysql_fetch_assoc($a_commander);
$totalRows_a_commander = mysql_num_rows($a_commander);
La définition de ma boucle que voici (c'est un do while).

Code :
while ($row_a_commander = mysql_fetch_assoc($a_commander));
Mon problème c'est que la requête lit tout les enregistrement du tableau avec les conditions qui sont fixées bien sûr.

Mais je voudrais que le champ associations_produits.id_produit ne soit affiché qu'une seule fois pour une même valeur de ce champ

ex :
une ligne pour le produit 56
une ligne pour le produit 72

mais si le produit 56 est de nouveau présent dans la table, je voudrais sauter ce nouvel enregistrement
et ensuite reprendre la lecture du tableau

une ligne pour le 87 ect...

es ce que c'est possible ?

merci d'avoir eu la patience de me lire
ripout est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2010, 19h33   #2
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 815
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 815
Points : 3 440
Points : 3 440
Oui c'est possible. Il faut stocker dans un tableau les identifiants rencontrés dans la boucle et avant tout nouvel affichage s'assurer que l'identifiant n'est pas présent de le tableau.
Ceci dit il vaudrait mieux faire une requête sans doublons.
D'ailleurs à propos de la requête, pour les jointures, ils faut utiliser INNER JOIN.
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2010, 20h32   #3
Invité régulier
 
Inscription : août 2010
Messages : 24
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 24
Points : 8
Points : 8
Je crois avoir compris le fonctionnement de INNER JOIN après quelques lectures.

Cependant je ne vois pas comment écrire ma requête car dedans je dois faire un WHERE = "A commander" sur le champ suivi de la table production, est ce que je peux faire juste après un AND FROM matable INNER JOIN matable2 (matable.champ = matable2.champ) ?

La solution pour créer un tableau ou stocker les identifiants stockés par la boucle m'intéresse beaucoup .

sans vouloir abuser , Je suis prenneur d'une piste pour m'orienter sur le sujet.

merci encore
ripout est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2010, 20h58   #4
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 815
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 815
Points : 3 440
Points : 3 440
Citation:
Envoyé par ripout Voir le message
Je crois avoir compris le fonctionnement de INNER JOIN après quelques lectures.

Cependant je ne vois pas comment écrire ma requête car dedans je dois faire un WHERE = "A commander" sur le champ suivi de la table production
La requête suivante est identique à la tienne :

Code :
1
2
3
4
5
SELECT *
FROM production
INNER JOIN associations_produits ON production.id_recette = associations_produits.id_recette
INNER JOIN produits ON associations_produits.id_produit = produits.id
WHERE production.suivi = 'A commander'
Citation:
La solution pour créer un tableau ou stocker les identifiants stockés par la boucle m'intéresse beaucoup .
... mais franchement pas efficace, et puis c'est le rôle de SQL de te sortir des données comme il faut.

Donne la structure de tes 3 tables, un petit extrait significatif de données et ce que tu souhaites en obtenir.
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2010, 22h37   #5
Invité régulier
 
Inscription : août 2010
Messages : 24
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 24
Points : 8
Points : 8
Par défaut super sympas de m'aider

Tout d'abord Séb. merci beaucoup de prendre le temps de m'aider et de partager ton savoir.

Je note l'utilisation de INNER JOIN pour déterminer les liaisons.

Alors pour mes tables
Citation:
table produits

id int(11) (clé primaire auto incrémentée)
type varchar(50)
designation varchar(80)
unite_volume varchar(2)
densite decimal(6,3)
valeur_goutte_ml decimal(6,3)
conditionnement int(11)
prix_conditionnement decimal(5,2)


table recettes

id int(11) (clé primaire auto incrémentée)
designation varchar(80)
quantite int(11) (j'aurais pu l'apeller conditionnement, ce champ contient pour quelle quantite de la recette sont données les proportions d'ingrédients.)
procede text
commentaire text


table associations_produits

id int(11) (clé primaire auto incrémentée)
id_produit int(11)
id_recette int(11)
quantite decimal(6,2)


table entrees_stock (j'aurais pu apeller cette table mouvements de stock, j'y enregistre ce qui entre en stock en effet et aussi ce qui en sort en négatif)

id int(11) (clé primaire auto incrémentée)
date varchar(10) (honte à moi de pas l'avoir déclaré en champ date mais je n'ai pas besoin de faire de calculs spécifique au dates alors bon...)
produit int(11)
quantite decimal(6,2)
prix decimal(5,2)


table production

id int(11) (clé primaire auto incrémentée)
suivi varchar(50)
id_recette int(11)
quantite int(11)
date varchar(10)
Pour ce que je souhaite en obtenir.

Dans la table production j'indique que une quantité x d'une recette est commandée, la table associations_produits me permet d'indiquer quelle quantité et e quels ingrédients sont nécessaires pour cette recette, et dans table produits je peut voir quels sont les détails de ces produits.

Au final je veut générer un tableau dynamique dans lequel je synthétise quels produits sont nécessaires à la réalisation des recettes commandées moins les quantités que j'ai déjà en stock.

Une préparation de commande fournisseur en quelque sorte

J'espère que j'ai été clair et n'avoir rien oublié, et aussi de ne pas avoir construit ma base de données trop n'importe comment.

Je me répète encore mais merci beaucoup d'avoir la patience de me lire
ripout est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2010, 23h45   #6
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 277
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 277
Points : 2 323
Points : 2 323
Bonjour,

oui il faut toujours essayer de ramener le minimum d'information de MySQL afin de gagner en performances et en mémoire.

Ceci dit à titre d'information, tu peux sauter une occurence de boucle à l'aide de continue

Exemple :

Code php :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
$exclude = array(4, 7);
$affichages = 0;
 
for($i=1; $i<11; $i++){
	if(in_array($i, $exclude))
		continue;
 
	echo $i . ' pas dans le tableau ! <br />' ;
	$affichages++;
}	
 
echo $affichages . ' affichages au total';
 
/* -->
1 pas dans le tableau !
2 pas dans le tableau !
3 pas dans le tableau !
5 pas dans le tableau !
6 pas dans le tableau !
8 pas dans le tableau !
9 pas dans le tableau !
10 pas dans le tableau !
8 affichages au total
*/
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2010, 23h56   #7
Modérateur
 
Inscription : septembre 2010
Messages : 7 057
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 057
Points : 8 399
Points : 8 399
tu fais pas de distrinct ni de group by ? ou un NOT IN si ca dépend d'autre chose ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 21h54   #8
Invité régulier
 
Inscription : août 2010
Messages : 24
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 24
Points : 8
Points : 8
Bonsoir,

merci pour vos réponse.

J 'explore les pistes que vous me donnez et je reviens honteusement poster ensuite.
ripout est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 22h28   #9
Invité régulier
 
Inscription : août 2010
Messages : 24
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 24
Points : 8
Points : 8
Par défaut Merci

Bonsoir.

j'ai enfin eu un peu de temps pour potasser mon application.

et grâce a toutes vos pistes et tous vos conseils.

ça marche enfin impec !

Merci beaucoup à tous
ripout est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h45.


 
 
 
 
Partenaires

Hébergement Web