Extraire les produits qui n'ont pas une qte dans un mois donnée
LearnDeep
Messages postés
67
Date d'inscription
Statut
Membre
Dernière intervention
-
Pitet Messages postés 2826 Date d'inscription Statut Membre Dernière intervention -
Pitet Messages postés 2826 Date d'inscription Statut Membre Dernière intervention -
Bonjour ,
je suis nouveau dans php 7 , j'ai crée une table production qui contient id du produit , ligne , nom de produit(produit) champ date(format(Y-m-d)) , heure et un champ qte (quantité).
Aprés ça j'ai crée une requete qui permet d'extraire les produits et leurs informations dans chaque mois données (avec une boucle foreach) , mais la requete me donne seulement les produits qui ont un enregistrement dans le mois donnée.
Mon but est d'ajouter chaque produit qui n'a pas aucun enregistrement dans un mois données aux résultats de la requete et mettre la valeur qte a zéro.
le problème est que seulement les produits qui ont une quantité dans un mois s'affichent , pour les autres mois on ne trouve pas ce produit et sa qte a zéro.
le but final est d'afficher les produits un par un pour chaque mois et si on ne trouve pas un enregistrement dans un mois donnée on affiche tous les informations du produit mais avec une qte est égale a zéro,
J'ai essayé pour deux jours mais tous ce que j'ai trouvé est les produits qui ont déja un enregistement dans un mois donnees.
Tous les résultas que j'ai obtenu:
On peut observer que le dernier enregistement par exemple a une qte seulement dans le mois 8 mais dans les autres mois il n'a pas, l'objectif est d'afficher ce meme produit pour tous le autres mois mais avec une qte est égale a zéro.
J'ésprere que quelqun peut m'aider et pardonnez moi pour ma langue Français parceque je parle l'Anglais beaucoup mieux.
je suis nouveau dans php 7 , j'ai crée une table production qui contient id du produit , ligne , nom de produit(produit) champ date(format(Y-m-d)) , heure et un champ qte (quantité).
Aprés ça j'ai crée une requete qui permet d'extraire les produits et leurs informations dans chaque mois données (avec une boucle foreach) , mais la requete me donne seulement les produits qui ont un enregistrement dans le mois donnée.
Mon but est d'ajouter chaque produit qui n'a pas aucun enregistrement dans un mois données aux résultats de la requete et mettre la valeur qte a zéro.
le problème est que seulement les produits qui ont une quantité dans un mois s'affichent , pour les autres mois on ne trouve pas ce produit et sa qte a zéro.
le but final est d'afficher les produits un par un pour chaque mois et si on ne trouve pas un enregistrement dans un mois donnée on affiche tous les informations du produit mais avec une qte est égale a zéro,
J'ai essayé pour deux jours mais tous ce que j'ai trouvé est les produits qui ont déja un enregistement dans un mois donnees.
public function getProductsStatsByMonths(){ $today = date("Y-m-d"); $date_arr = explode("-", $today); $year = $date_arr[0]; $month = $date_arr[1]; $day = $date_arr[2]; $prods = array(); $months = array( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 ); foreach ($months as $month){ $stmt = $this->conn->prepare("SELECT sum(qte) as total,ligne, produit,date,heure,qte FROM production where YEAR(date) = ? and MONTH(date) = ? group by LOWER(ligne) "); $stmt->execute([$year,$month]); while( $row = $stmt->fetch(pdo::FETCH_ASSOC)){ array_push($prods, new ProductionByMonth(0,$row["ligne"],$row["produit"],$row["date"],$row["heure"],$row["qte"],$month,$year)); } } echo json_encode($prods); }
Tous les résultas que j'ai obtenu:
[ { "id": 0, "ligne": "Biscuit", "produit": "Major", "date": "2021-08-11", "heure": "10:00", "qte": "130", "month": 8, "year": "2021" }, { "id": 0, "ligne": "Eau", "produit": "Safia 1.5", "date": "2021-08-11", "heure": "14:00", "qte": "200", "month": 8, "year": "2021" }, { "id": 0, "ligne": "Lait", "produit": "Vitalait 1/2", "date": "2021-08-11", "heure": "8:00", "qte": "80", "month": 8, "year": "2021" }, { "id": 0, "ligne": "Salami", "produit": "Mazraa", "date": "2021-08-11", "heure": "8:00", "qte": "100", "month": 8, "year": "2021" }, { "id": 0, "ligne": "Yaourt", "produit": "Delice", "date": "2021-08-11", "heure": "12:00", "qte": "150", "month": 8, "year": "2021" } ]
On peut observer que le dernier enregistement par exemple a une qte seulement dans le mois 8 mais dans les autres mois il n'a pas, l'objectif est d'afficher ce meme produit pour tous le autres mois mais avec une qte est égale a zéro.
J'ésprere que quelqun peut m'aider et pardonnez moi pour ma langue Français parceque je parle l'Anglais beaucoup mieux.
A voir également:
- Extraire les produits qui n'ont pas une qte dans un mois donnée
- Ryanair produits interdits en cabine - Guide
- Extraire une video youtube - Guide
- Extraire le son d'une vidéo - Guide
- Extraire texte d'une image - Guide
- Extraire image pdf - Guide
2 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour,
je pense que ta base de données est mal conçue. moi je travaillerais avec trois tables:
une table produits
une table mois
une table production
ce qui me permettrait de faire une requête qui me fournit le résultat attendu.
je pense que ta base de données est mal conçue. moi je travaillerais avec trois tables:
une table produits
une table mois
une table production
ce qui me permettrait de faire une requête qui me fournit le résultat attendu.
Bonjour,
Exécuter une requête sql dans une boucle est souvent une mauvaise pratique si on peut faire autrement. Dans ton cas on peut facilement remplacer la boucle et les 12 requêtes en une seule.
Pour récupérer tous les enregistrements pour lesquels la colonne month peut avoir plusieurs valeurs, il faudrait plutôt utiliser l'opérateur IN à la place de l'opérateur = dans la clause WHERE de la requête sql.
Par exemple au lieu d'exécuter 12 fois la requête dans la boucle :
On peut exécuter une seule requête équivalente comme ceci :
Ce qui pourrais donner pour ton code :
Si tu veux récupérer tous les enregistrements peu importe la valeur de month, tu peux simplement supprimer la clause WHERE sur cette colonne, soit :
Bonne journée,
Exécuter une requête sql dans une boucle est souvent une mauvaise pratique si on peut faire autrement. Dans ton cas on peut facilement remplacer la boucle et les 12 requêtes en une seule.
Pour récupérer tous les enregistrements pour lesquels la colonne month peut avoir plusieurs valeurs, il faudrait plutôt utiliser l'opérateur IN à la place de l'opérateur = dans la clause WHERE de la requête sql.
Par exemple au lieu d'exécuter 12 fois la requête dans la boucle :
SELECT * FROM production WHERE MONTH(date) = 1 SELECT * FROM production WHERE MONTH(date) = 2 //etc...
On peut exécuter une seule requête équivalente comme ceci :
SELECT * FROM production WHERE MONTH(date) IN (1, 2, 3, etc...)
Ce qui pourrais donner pour ton code :
// [...] $prods = array(); $months = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); $monthsString = implode(', ', $months); // string(37) "1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12" $stmt = $this->conn->prepare("SELECT sum(qte) as total,ligne, produit,date,heure,qte FROM production where YEAR(date) = ? and MONTH(date) IN (?) group by LOWER(ligne) "); $stmt->execute([$year, $monthsString]); $results = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($results as $row){ array_push($prods, new ProductionByMonth(0,$row["ligne"],$row["produit"],$row["date"],$row["heure"],$row["qte"],$month,$year)); } echo json_encode($prods);
Si tu veux récupérer tous les enregistrements peu importe la valeur de month, tu peux simplement supprimer la clause WHERE sur cette colonne, soit :
// [...] $prods = array(); $stmt = $this->conn->prepare("SELECT sum(qte) as total,ligne, produit,date,heure,qte FROM production where YEAR(date) = ? group by LOWER(ligne) "); $stmt->execute([$year]); $results = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($results as $row){ array_push($prods, new ProductionByMonth(0,$row["ligne"],$row["produit"],$row["date"],$row["heure"],$row["qte"],$month,$year)); } echo json_encode($prods);
Bonne journée,
Bonjour , merci pour la réponse , je veux dire que les produits enregistrés enregistrés dans la base de données sont seulement qui ont une qte > 0 , mon but est de copier coller ces produits pour les mois que ces produits ne sont pas liés et mettre la valeure qte a zéro , est ce que cette solution peut faire ça?
Je ne suis pas sûr d'avoir bien compris ta demande. Quand tu indiques "mon but est de copier coller les produits pour les mois [sans produits ?] et mettre la valeur qte à 0", est-ce tu veux dupliquer les enregistrements dans la base ou seulement mettre à jour les enregistrements déjà présents dans la base ?
Si il s'agit du deuxième cas, il faudrait faire une requête UPDATE par exemple comme ceci :
Je suppose que la valeur est null si la colonne month n'est pas renseigné dans l'enregistrement. Si il s'agit d'une chaine vide, il faudra corriger la comparaison dans la clause where (WHERE month = '').
Si il s'agit du deuxième cas, il faudrait faire une requête UPDATE par exemple comme ceci :
UPDATE production SET qte = 0 WHERE month = null
Je suppose que la valeur est null si la colonne month n'est pas renseigné dans l'enregistrement. Si il s'agit d'une chaine vide, il faudra corriger la comparaison dans la clause where (WHERE month = '').
En effet merci pour le rappel yg_be et désolé LearnDeep, j'ai lu trop vite et les solutions que j'ai proposées ne correspondent pas à la demande initiale.
La première remarque de yg_be est la meilleure réponse, tu devrais vraiment suivre son conseil et réorganiser tes données dans plusieurs tables en utilisant le modèle relationnel.
Avoir une base avec des données bien organisées va beaucoup simplifier les traitements en php.
La première remarque de yg_be est la meilleure réponse, tu devrais vraiment suivre son conseil et réorganiser tes données dans plusieurs tables en utilisant le modèle relationnel.
Avoir une base avec des données bien organisées va beaucoup simplifier les traitements en php.