<config>Windows / Opera Next 60.0.3255.95 / Mysql</config>
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 :
L'erreur me renvois vers une erreur de syntaxe tels que suit :
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 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;
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part MySQL a répondu: # 1064 - Erreur de syntaxe près de 'IF' (new.client! = '') THEN WHERE nom LIKE CONCAT ('%', NEW.client, '%') END IF;
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 :
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.
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 $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();
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.
voila mon tableau qui contient mon filtre :
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 +----+-------------+---------+--------+--------------+-------+---------+---------+ | 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 | +----+-------------+---------+--------+--------------+-------+---------+---------+
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 +----+--------+---------+------+--------------+------+ | temp_fetch | +----+--------+---------+------+--------------+------+ | id | client | commune | type | matricule | tare | +----+--------+---------+------+--------------+------+ | 1 | EPIC | | | | | +----+--------+---------+------+--------------+------+
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 +----------------------------+ | max_tare | +----------------------------+ | id | max_row | max_tare | +----+------------+----------+ | 1 | 2 | 14900 | +----+------------+----------+
<code>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 </code>
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.
Partager