Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

REQUETE UPDATE COMPLEXE


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    septembre 2016
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : septembre 2016
    Messages : 27
    Points : 10
    Points
    10
    Par défaut REQUETE UPDATE COMPLEXE
    Environnement Laravel 5.7 | PHP 7.3

    Je dois créer une requête UPDATE assez complexe.

    CONTEXTE
    Ma table contient, en autres, les informations suivantes :

    un champ id (clé primaire que j'utilise comme no de produit)
    un champ orderID qui est le no de commande (une commande peut contenir plusieurs produits)
    un champ orderstatusID qui contient le statut de la commande

    La requête doit mettre à jour le champ orderstatusID avec la valeur 5 uniquement si tous les produits d'une même commande ont le orderstatusID = 4, si un produit n'a pas le orderstatusID = 4, alors la commande ne peut pas etre archivée et se voir attribuer le orderstatusID "5".

    J'ai créé un bouton bulk action dans ma table avec lequel je peux mettre a jour le de la commande ée lorsque les produits de la commande ont toutes = 4.

    Je compte avec une première requête combien de produits ont un status différent de 4. Si la requête retourne "0" alors j'exécute ma requête et le status de tous les produits de la commande cochée se voit attribuer "5"
    Code : Tout sélectionner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if($button_name == 'set_collected' && $statusorderID_4 == 0) {
    DB::table('orders_detail_new')
    ->where('statusorderID',4)
    ->whereIn('orderID',[$orderid])
    ->update(['statusorderID' => 5]);
    CRUDBooster::redirect($_SERVER['HTTP_REFERER'],"La commande a été archivée.","success");
    }
    Cela fonctionne et ne doit fonctionner que pour une commande.

    PROBLEME
    Par contre, je ne vois pas comment pouvoir créer une requête qui loop toutes la table et attribue le orderstatusID = 5 à tous les produits de toutes commandes dont tous les produits ont exclusivement un orderstatusID = 4.


    Dans l'exemple de table ci-dessous,
    1. Prenons la commande (orderID) 1, nous pouvons voir que les produits de cette commande (productID [1,2,3,4,5] ont tous le orderstatusID = 4), la requete doit mettre à jour le orderstatusID de cette commande avec la valeur "5"
    2. Prenons a présent la commande (orderID) 5, nous pouvons voir qu'un produit (productID 16) a un orderstatusID = 3, la requête ne doit pas mettre à jour le orderstatusID de cette commande.

    Pour cet exemple de données, la requête devrait mettre à jour le orderstatusID de tous les produits des commandes [1,3,4,6,7,9,10] avec la valeur 5.

    TABLE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    productID | orderID | orderstatusID
    1 | 1 | 4
    2 | 1 | 4
    3 | 1 | 4
    4 | 1 | 4
    5 | 1 | 4
    6 | 2 | 4
    7 | 2 | 4
    8 | 2 | 4
    9 | 2 | 4
    10 | 2 | 3
    11 | 3 | 4
    12 | 3 | 4
    13 | 4 | 4
    14 | 5 | 4
    15 | 5 | 4
    16 | 5 | 3
    17 | 6 | 4
    18 | 6 | 4
    19 | 6 | 4
    20 | 6 | 4
    21 | 7 | 4
    22 | 7 | 4
    23 | 7 | 4
    24 | 7 | 4
    25 | 7 | 4
    26 | 8 | 4
    27 | 8 | 3
    28 | 8 | 4
    29 | 8 | 4
    30 | 8 | 4
    31 | 8 | 4
    32 | 9 | 4
    33 | 9 | 4
    34 | 10 | 4
    35 | 10 | 4
    36 | 10 | 4
    37 | 10 | 4
    38 | 10 | 4
    39 | 10 | 4
    40 | 10 | 4
    Merci d'avance pour toute suggestion.

  2. #2
    Membre éprouvé

    Homme Profil pro
    Consultant ERP
    Inscrit en
    janvier 2013
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Conseil

    Informations forums :
    Inscription : janvier 2013
    Messages : 348
    Points : 1 190
    Points
    1 190
    Par défaut
    Bonjour,
    Quelle est la base de données? Ca doit pouvoir se faire en une seule requête SQL avec deux sous-requêtes, pas besoin d'ORM (aussi je ne connais pas Laravel ).

    Un point important, c'est que la conception de la base a tout l'air à revoir... Il y a plus de sens j'ai l'impression à avoir une table commande avec son statut, et une table lignes de la commande avec les différents produits, quantités...
    Soit commande(id clé primaire, statut) et ligne_commande(id clé primaire, commande_id clé étrangère, produit, ...).

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    septembre 2016
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : septembre 2016
    Messages : 27
    Points : 10
    Points
    10
    Par défaut
    Merci pour ton retour MaximCH et tes suggestions. Concernant la base de donnees, cela se discute, les avis different sur ce point et ce n'est pas le sujet de mon post. Par contre, si cela semble si simple pour toi concernant la requete, pourrais-tu stp eclairer ma lanterne ? Merci d'avance.

  4. #4
    Membre éprouvé

    Homme Profil pro
    Consultant ERP
    Inscrit en
    janvier 2013
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Conseil

    Informations forums :
    Inscription : janvier 2013
    Messages : 348
    Points : 1 190
    Points
    1 190
    Par défaut
    Quelle est ta base de données?
    Edit : ton SGBD*. C'est pas pour être chiant, ça peut jouer sur la syntaxe de l'update.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    septembre 2016
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : septembre 2016
    Messages : 27
    Points : 10
    Points
    10
    Par défaut
    @MaximeCh
    Pas de souci et desole, j'avais zappe : MySQL. Merci d'avance pour ton expertise.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    septembre 2016
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : septembre 2016
    Messages : 27
    Points : 10
    Points
    10
    Par défaut SOLUTION
    Laravel 5.7 | PHP 7.3

    Function Controller

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
     
    			public function archive() {
     
    				# ARCHIVE ALL ORDERS WHICH HAVE ALL THEIR ORDERED PRODUCTS WITH ORDERSTATUSID = 4
    				# SQL : GET THE ORDERIDS FROM THE ORDERS AND PRODUCTS TO ARCHIVE
    				$archive = DB::select( DB::raw("SELECT DISTINCT(orderID), (SELECT COUNT(*) FROM orders_detail_new t2 WHERE t1.OrderID = t2.OrderID AND (t2.statusorderID != 4 OR t2.statusorderID IS NULL)) FROM orders_detail_new t1 WHERE !(SELECT COUNT(*) FROM orders_detail_new t2 WHERE t1.OrderID = t2.OrderID AND (t2.statusorderID != 4 OR t2.statusorderID IS NULL))"));
     
    				# dd($archive);
     
    				if($button_name == 'set_archived') {
    					DB::table('orders_detail_new')
    					->whereIn('orderID',[$archive])
    					->update(['statusorderID' => 5]);
    					CRUDBooster::redirect($_SERVER['HTTP_REFERER'],"Toutes les commandes aux ordres ACHEVES ont été ARCHIVEES.","success");
    				}
     
    			}

  7. #7
    Membre éprouvé

    Homme Profil pro
    Consultant ERP
    Inscrit en
    janvier 2013
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Conseil

    Informations forums :
    Inscription : janvier 2013
    Messages : 348
    Points : 1 190
    Points
    1 190
    Par défaut
    Bonjour,
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    update order_details_new set order_status_id=5 where id in
    (
        select a.id from
        (
            select id, min(order_status_id) min, max(order_status_id) max from order_details_new
            group by id
            having min=max and min=4
        ) as a
    );

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pb update dataset "requete trop complexe"
    Par timotep dans le forum VB.NET
    Réponses: 3
    Dernier message: 24/08/2007, 10h47
  2. [SYBASE] optimisation requete UPDATE
    Par metheorn dans le forum Sybase
    Réponses: 8
    Dernier message: 24/05/2004, 18h01
  3. [version] Requete Update avec différentes versions de mySQL
    Par regbegpower dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/01/2004, 18h19
  4. Requete update
    Par gianfare dans le forum Langage SQL
    Réponses: 7
    Dernier message: 10/10/2003, 10h04
  5. [debutante] erreur requete update
    Par LineLe dans le forum ASP
    Réponses: 5
    Dernier message: 12/09/2003, 14h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo