Une des choses qui j'aime dans la société ou je travail, c'est de trouver des 'jokes' en lisant les scripts des nos devs.
En fait, nous bossons avec des bases MySQL 4.0.24 (La honte :) sous linux, la chose qui exclut l'utilisation de plein de fonctions définit dans les versions du MySQL qui suivent, tel les sous-selections (SubSELECT), GROUP_CONCAT, ROLLUP, ..., en deux mots la puissance du MySQL!
Et par conséquent, dans nos script, on ne fait que des simples SELECT ... FROM, et encore pire, dans la plupart des cas, on fait des requetes du genre : "Wa7da te7leb wlo5ra tched le9roun" (ceci est malheureusement est intraduisible en français :).
Voici un exemple simplifié du l'existant, ou on suppose qu'on possede une table du suivi des clients Reporting_client :
Sans trop de detail, id_client c'est l'id du client bien evidement, type_action contient le type d'action du client ('O' ouverture, 'C' clique) et date_action :
Une question qui se pose presque toujours chez nous, c'est de connaitre les actions d'un client, autrement "determiner les clients ouvereurs/cliqueurs, ouvereurs non cliqueurs, cliqueurs non ouvereurs, etc..". Et pour resoudre ce fardeaux, chez nous, on passe toujours par ce qui suit :
BIB :
En fait, nous bossons avec des bases MySQL 4.0.24 (La honte :) sous linux, la chose qui exclut l'utilisation de plein de fonctions définit dans les versions du MySQL qui suivent, tel les sous-selections (SubSELECT), GROUP_CONCAT, ROLLUP, ..., en deux mots la puissance du MySQL!
Et par conséquent, dans nos script, on ne fait que des simples SELECT ... FROM, et encore pire, dans la plupart des cas, on fait des requetes du genre : "Wa7da te7leb wlo5ra tched le9roun" (ceci est malheureusement est intraduisible en français :).
Voici un exemple simplifié du l'existant, ou on suppose qu'on possede une table du suivi des clients Reporting_client :
CREATE TABLE `Reporting_client` (
`id_client` INT NOT NULL ,
`type_action` VARCHAR( 3 ) NOT NULL ,
`date_action` DATETIME NOT NULL
) TYPE = MYISAM ;
Sans trop de detail, id_client c'est l'id du client bien evidement, type_action contient le type d'action du client ('O' ouverture, 'C' clique) et date_action :
mysql> SELECT * FROM Reporting_client ;
+-----------+-------------+---------------------+
| id_client | type_action | date_action |
+-----------+-------------+---------------------+
| 1 | O | 2006-12-01 15:07:53 |
| 1 | C | 2006-12-01 15:07:53 |
| 1 | C | 2006-12-01 15:07:53 |
| 2 | O | 2006-12-01 15:07:53 |
+-----------+-------------+---------------------+
4 rows in set (0.00 sec)
Une question qui se pose presque toujours chez nous, c'est de connaitre les actions d'un client, autrement "determiner les clients ouvereurs/cliqueurs, ouvereurs non cliqueurs, cliqueurs non ouvereurs, etc..". Et pour resoudre ce fardeaux, chez nous, on passe toujours par ce qui suit :
Lancer la requete :
" SELECT *
FROM Reporting_client
WHERE type_action = 'O'"
Pour chaque client trouvé, lancer la 2e requete :
" SELECT count(*)
FROM Reporting_client
WHERE type_action = 'C'
AND id_client = ? "
- En sachant que notre table contient des milliers voir millions des lignes, un tel script, sera un vrai cauchemar pour le serveur, et pour nous par conséquant!
En reponse : parfois il suffit d'interroger un moteur de recherche pour tomber sur un forum ou sur un tutorial qui explique mieux les choses et qui propose des solution elegante, comme celle ci :
The simple secret, and it's also why they work in almost all databases, is the following functions:Donc, pour exploiter ceci, on aura besoin des code ASCII des caractere 'O' et 'C' qui sont respectivement 79 et 67. Puis, et par magie, du math (que j'aime pas :), on applique les regeles précédentes on aura la solution toute en un (une seule requete qui nous donne tout les comptages des ouvreurs, cliqueurs, ... ) :
o sign (x) returns -1,0, +1 for values x < x =" 0,"> 0 respectively
o abs( sign( x) ) returns 0 if x = 0 else, 1 if x > 0 or x < x =" 0">
o 1-abs( sign( x) ) complement of the above, since this returns 1 only if x = 0
mysql> select ASCII('C'), ASCII('O');
+------------+------------+
| ASCII('C') | ASCII('O') |
+------------+------------+
| 67 | 79 |
+------------+------------+
1 row in set (0.00 sec)
mysql> SELECT id_client,
-> SUM(( 1 - ABS( SIGN( ASCII(type_action) - 79 )))) AS open,
-> SUM(( 1 - ABS( SIGN( ASCII(type_action) - 67 )))) AS clik
-> FROM Reporting_client
-> GROUP BY id_client;
+-----------+------+------+
| id_client | open | clik |
+-----------+------+------+
| 1 | 1 | 2 |
| 2 | 1 | 0 |
+-----------+------+------+
2 rows in set (0.00 sec)BIB :






