Plusieurs IF pour différentes sélections conditionnelles dans un déclencheur

Fermé
LORD_alucard Messages postés 3 Date d'inscription vendredi 24 mai 2019 Statut Membre Dernière intervention 25 mai 2019 - Modifié le 24 mai 2019 à 11:43
yg_be Messages postés 22726 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 - 26 mai 2019 à 10:29
Bonjour,



Configuration: Windows / Opera Next 60.0.3255.95 / Mysql


J'ai un problème lorsque j'essaie de calculer le nombre de lignes dans ma table, en utilisant des conditions ifs multiples séparées dans un déclencheur pour tester si le champ s'il est vide ou pas.

J'ai essayé de mettre le si hors de la fonction de sélection et cela fonctionne mais je ne peux pas le faire pour tous les cas possible que j'ai, ce ne sera pas optimisé.

voila le code à l'intérieur du déclencheur :

UPDATE max_tare
SET max_row = (SELECT COUNT(*)FROM history 
                              IF(NEW.client != '') THEN
                              WHERE nom LIKE CONCAT('%', NEW.client, '%') END IF;
                              IF(NEW.commune != '') THEN
                              WHERE commune LIKE CONCAT('%', NEW.commune, '%') END IF;
                              IF(NEW.type != '') THEN
                              WHERE type LIKE CONCAT('%', NEW.type, '%') END IF;
                              IF(NEW.matricule != '') THEN
                              WHERE mat LIKE CONCAT('%', NEW.matricule, '%') END IF;
                              IF(NEW.tare != '') THEN
                              WHERE tare LIKE CONCAT('%', NEW.tare, '%') END IF;
                              WHERE cancled = 0), 
max_tare = (SELECT SUM(tare)  FROM history
                                            WHERE cancled = 0) WHERE id = 1;


L'erreur me renvois vers une erreur de syntaxe tels que suit :
MySQL a répondu: # 1064 - Erreur de syntaxe près de 'IF' (new.client! = '') THEN WHERE nom LIKE CONCAT ('%', NEW.client, '%') END IF;


voila tout d'abord j'ai pensé que c'est une histoire de délimiter j'ai essayer d'éditer en ligne et de changer de delimiter mais toujours c'est le même problème apres tout c'est peut être ma méthode d'insertion de delimiter qui est fausse, car je suis un débutant novice en sql

mais en tout cas je sais que le solution elle existe, car quand je travaille en query sous php en utilisant le framework codeigniter en utilisant ce code la :
$this->db->select("*");

$this->db->from('history');

if ($query[1] != '') {
    $this->db->like('nom', $query[1]);
                }
if ($query[2] != '') {
    $this->db->like('commune', $query[2]);
                }
if ($query[3] != '') {
    $this->db->like('type', $query[3]);
                }
if ($query[4] != '') {
    $this->db->like('mat', $query[4]);
                }
if ($query[10] != '') {
    $this->db->like('rfid', $query[10]);
                }
if ($query[5] != '') {
    $this->db->like('tare', $query[5]);
                }
if ($query[6] != '') {
    $this->db->where('date >', $query[6]);
                }
if ($query[7] != '') {
    $this->db->where('date <', $query[7]);
                }
if ($query[11] != '') {
    $this->db->where('time_plode >', $query[11]);
                }
if ($query[12] != '') {
    $this->db->where('time_plode <', $query[12]);
                }
$this->db->where('cancled', 0);
return $this->db->count_all_results();


biensure ce code récupéré que le nombre total des lignes et non pas la somme mais ce n'est pas soucis j'ai juste mise une partie car c'est le même code sauf que je change la fonction d'interrogation de la base de donnée.

le seul soucis avec php c'est que les requête prenne beaucoup de temps a s'exécute, et c'est pour cela je voulais un déclencheur (triggers) pour faire les chose en arrière plan.

bon afin de rapprocher mieux l'idée de ce que je veux exactement je vais vous faire un exemple :

ça c'est ma table history au quel je veux compter les lignes ayant cancled égal a 0 et répond au champ du filtre.

+----+-------------+---------+--------+--------------+-------+---------+---------+
|                                         history                                |
+----+-------------+---------+--------+--------------+-------+---------+---------+
| id | nom         | commune | type   | mat          | tare  | rfid    | cancled |
+----+-------------+---------+--------+--------------+-------+---------+---------+
| 1  | EPIC paris  | france  | white  | 01248-816-16 | 7600  | ABCF44C | 0       |
+----+-------------+---------+--------+--------------+-------+---------+---------+
| 2  | EPIC london | UK      | white  | 06854-315-16 | 5233  | A8CG27C | 1       |
+----+-------------+---------+--------+--------------+-------+---------+---------+
| 3  | NET barça   | ESP     | red    | 03254-615-16 | 8900  | HBC54AC | 1       |
+----+-------------+---------+--------+--------------+-------+---------+---------+
| 4  | NET Dubai   | arab    | blue   | 35251-117-16 | 11200 | HDK7BV5 | 0       |
+----+-------------+---------+--------+--------------+-------+---------+---------+
| 5  | EPIC roma   | ita     | red    | 36524-618-16 | 7300  | NBL53DC | 0       |
+----+-------------+---------+--------+--------------+-------+---------+---------+
| 6  | SNC beta    | alpha   | green  | 69358-117-16 | 5400  | JDLF8ND | 1       |
+----+-------------+---------+--------+--------------+-------+---------+---------+
| 7  | EPIC tokyo  | japan   | yellow | 46258-712-16 | 8700  | K5ND55D | 1       |
+----+-------------+---------+--------+--------------+-------+---------+---------+
| 8  | SARL Fit    | body    | black  | 69531-614-16 | 9600  | AIES5HJ | 0       |
+----+-------------+---------+--------+--------------+-------+---------+---------+ 


voila mon tableau qui contient mon filtre :
+----+--------+---------+------+--------------+------+
|                     temp_fetch                     |
+----+--------+---------+------+--------------+------+
| id | client | commune | type | matricule    | tare |
+----+--------+---------+------+--------------+------+
| 1  | EPIC   |         |      |              |      |
+----+--------+---------+------+--------------+------+


en choisissant le mot "EPIC" qui dois figurer dans les lignes contenants EPIC dans leur nom et aussi ayant cancled = 0 mon résultat devrais être comme ceci :
+----------------------------+
|          max_tare          |
+----------------------------+
| id |  max_row   | max_tare |
+----+------------+----------+
| 1  |     2      | 14900    |
+----+------------+----------+

voila j'ai essayé plein d'exemple et de solution sans aboutir a un résultat concret, tout au moins il y'a une solution Archaïque, c'est de faire sortir les a l'extérieur, et faire un select from pour chaque cas obtenu, en d'autre mot :
si (client !=0 et commune ==0 et type == 0 et matricule == 0 et tare == 0) alors 
{filtrer selon client seulement }
sinon-si (client !=0 et commune !=0 et type == 0 et matricule == 0 et tare == 0) alors
{filtrer selon client et commune seulement }....ect

malheureusement pour moi je ne peux appeler cela comme solutions, car si je veux modifier ou rajouter un champs a mon filtre c'est tout le code se change.
Merci d'avance pour votre aide je reste disponible si vous voulez plus de clarification.

2 réponses

yg_be Messages postés 22726 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 476
26 mai 2019 à 10:29
bonjour, moi je ferais quelque chose comme:
SELECT COUNT(*),SUM(tare) FROM history, NEW 
WHERE 
( NEW.client = '' OR history.nom LIKE CONCAT('%', NEW.client, '%') )
AND
( NEW.commune = '' OR history.commune LIKE CONCAT('%', NEW.commune, '%') )
AND cancled = 0
;
1
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
24 mai 2019 à 14:14
Bonjour,

Construire une requête ... via une requête ne se fait pas... (ou alors c'est de la bidouille qui donne vite une usine à gaz... )

Si ton premier souci est un pb de lenteur.... commence par vérifier que tu as bien mis des INDEX dans tes tables. Les débutants ont tendance à les oublier.... et pouratnt ça peut diviser par 100000 les temps d'exécution de certaines requêtes.

0
LORD_alucard Messages postés 3 Date d'inscription vendredi 24 mai 2019 Statut Membre Dernière intervention 25 mai 2019
25 mai 2019 à 18:12
bonjour Jordan45, merci pour ta réponse, es ce que tu pourrais me dire que veut tu dire par INDEX en mySQL??
en effet je suis un débutant :'( et je galère la avec la latence de mon siteweb.
merci en avance pour votre réponse.
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > LORD_alucard Messages postés 3 Date d'inscription vendredi 24 mai 2019 Statut Membre Dernière intervention 25 mai 2019
25 mai 2019 à 19:25
0
LORD_alucard Messages postés 3 Date d'inscription vendredi 24 mai 2019 Statut Membre Dernière intervention 25 mai 2019
25 mai 2019 à 19:37
bon voila, j'ai fais ma petite recherche sur les INDEX ce qui m'as mené a me documenté sur la méthode,
"B-TREE".
Bon pour être honnête je sais pas si cela, pourra m'aider bon en quelque sorte oui ça pourrais fais une différence légère du fais que je recherche les éléments ayant "cancled = 0" toujours, mais sinon pour tout autre chose j'utilise une recherche dynamique en ajax.
Je sais plus si les INDEX pourront m'aider a ce point a moins que je comprend tout a travers, sinon je veux savoir si je peux utiliser MongoDB, es cela va accélérer le processus
0