[RESOLU] REQUETE UPDATE COMPLEXE

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 : [RESOLU] REQUETE UPDATE COMPLEXE

Re: REQUETE UPDATE COMPLEXE

par Marc_Q » 11 févr. 2020, 15:41

@Spols
Excellent, merci beaucoup pour ton expertise et disponibilite. Effectivement, il fallait inserser la condition, j'ai compris a present comment elle fonctionne et elleretourne bien les bons orderID dans la BDD en production.

Re: REQUETE UPDATE COMPLEXE

par Spols » 11 févr. 2020, 09:35

inverse la condition
SELECT DISTINCT(orderID),  (SELECT COUNT(*) FROM _table t2 WHERE t1.OrderID = t2.OrderID AND t2.orderstatusID != 4)
FROM _table t1
WHERE !(SELECT COUNT(*) FROM _table t2 WHERE t1.OrderID = t2.OrderID AND t2.orderstatusID != 4)

Re: REQUETE UPDATE COMPLEXE

par Marc_Q » 11 févr. 2020, 03:30

@Spols

Merci pour ta contribution, j'apprecie, mais ta requete ne retourne pas les bonnes donnees. J'ai juste ajouter un DISTINCT et la colonne que je veux retourner :

Code : Tout sélectionner

SELECT DISTINCT(orderID), (SELECT COUNT(*) FROM _table t2 WHERE t1.OrderID = t2.OrderID AND t2.orderstatusID != 4) FROM _table t1 WHERE (SELECT COUNT(*) FROM _table t2 WHERE t1.OrderID = t2.OrderID AND t2.orderstatusID != 4)
retourne

orderID
(SELECT COUNT(*) FROM _table t2 WHERE t1.OrderID = t2.OrderID AND t2.orderstatusID != 4)
2 | 1
5 | 1
8 | 1

Elle devrait retourner orderID suivants : [1,3,4,6,7,9,10] , afin de pouvoir leur attribuer le orderstatusID "5". Il semble qu'elle retourne les orderID des orderID ayant au moins un orderstatusID ayant une valeur != 4.

Si je modifie "!= 4", par "= 4", alors ta requete me retourne tous les orderID de ma table.

Re: REQUETE UPDATE COMPLEXE

par Spols » 10 févr. 2020, 14:25

J'ai fait quelques essais
(ma table s'appelle test)

j'obtient ce qu'il faut updater avec ceci
SELECT *,  (SELECT COUNT(*) FROM test t2 WHERE t1.OrderID = t2.OrderID AND t2.orderstatusID != 4)
FROM test t1
WHERE (SELECT COUNT(*) FROM test t2 WHERE t1.OrderID = t2.OrderID AND t2.orderstatusID != 4)
Mais impossible de trouver comment faire l'update en même temps. Donc je pense qu'il faut le faire en 2 requètes

Re: REQUETE UPDATE COMPLEXE

par Marc_Q » 10 févr. 2020, 09:13

ERRATUM :
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 pas mettre à jour le orderstatusID de cette commande

doit etre modifie par

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"

Je n'ai pas trouve comment modifier une question.

REQUETE UPDATE COMPLEXE

par Marc_Q » 08 févr. 2020, 10:24

Environnement Laravel 5.7 | PHP 7.3

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

CONTEXTE
Ma table contient 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

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 le "5"

Code : Tout sélectionner

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 pas mettre à jour le orderstatusID de cette commande
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
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.