Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[MySQL] comment utiliser les IF

2 réponses
Avatar
survietamine
bonjour,

je ne sais pas utiliser les conditions IF dans les requêtes.
Je vous explique la situation :
Pour une hotline, j'ai une table crm_recept_appel avec les champs suivants :
- id
- id_client (permet la relation avec la table des clients)
- commentaire (résumé de l'appel)
- date_recept (timestamp unix de l'heure d'appel).

la requête suivante :
SELECT id_user, count(*), id_client
FROM crm_recept_appel
WHERE date_recept > UNIX_TIMESTAMP('$date_deb')
AND date_recept < UNIX_TIMESTAMP('$date_fin')
GROUP BY id_user

donne bien les appels par téléacteur.

Cependant, je souhaiterais inclure la condition suivante :
SI pour 2 appels consécutifs, l' id_client est le même et que le délai entre
les 2 appels est inférieur à 1200 sec, je ne compte qu'un appel au lieu de
2.
Vaut-il mieux que je le fasse en PHP ou bien c'est possible en MySQL ?

Merci pour votre aide.

2 réponses

Avatar
P'tit Marcel
survietamine écrivit:

la requête suivante :
SELECT id_user, count(*), id_client
FROM crm_recept_appel
WHERE date_recept > UNIX_TIMESTAMP('$date_deb')
AND date_recept < UNIX_TIMESTAMP('$date_fin')
GROUP BY id_user

donne bien les appels par téléacteur.

Cependant, je souhaiterais inclure la condition suivante :
SI pour 2 appels consécutifs, l' id_client est le même et que le délai
entre les 2 appels est inférieur à 1200 sec, je ne compte qu'un appel
au lieu de 2.
Vaut-il mieux que je le fasse en PHP ou bien c'est possible en MySQL ?



ama, les opérateurs de MySQL ne fonctionne qu'à l'intérieur d'une même
ligne. donc mieux vaut le faire en php ou perl.

ça serait peut être possible au prix d'une jointure ouverte de
crm_recept_appel sur elle-même mais la solution hors MySQL est plus simple
et moins casse-gueule.


--
P'tit Marcel
Avatar
Christophe Lephay
"P'tit Marcel" a écrit dans le
message de news:
survietamine écrivit:

> la requête suivante :
> SELECT id_user, count(*), id_client
> FROM crm_recept_appel
> WHERE date_recept > UNIX_TIMESTAMP('$date_deb')
> AND date_recept < UNIX_TIMESTAMP('$date_fin')
> GROUP BY id_user
>
> donne bien les appels par téléacteur.
>
> Cependant, je souhaiterais inclure la condition suivante :
> SI pour 2 appels consécutifs, l' id_client est le même et que le délai
> entre les 2 appels est inférieur à 1200 sec, je ne compte qu'un appel
> au lieu de 2.
> Vaut-il mieux que je le fasse en PHP ou bien c'est possible en MySQL ?

ama, les opérateurs de MySQL ne fonctionne qu'à l'intérieur d'une même
ligne. donc mieux vaut le faire en php ou perl.

ça serait peut être possible au prix d'une jointure ouverte de
crm_recept_appel sur elle-même mais la solution hors MySQL est plus simple
et moins casse-gueule.



D'autant plus qu'il faut au moins deux requêtes pour faire celà (de manière
à ce que trois appels espacés chacun de moins de 1200 secondes soient
compris comme un et un seul appel).

Par curiosité, voilà ce que celà donnerait (avec l'heure d'appel étant un
nombre de jour, soit 0.5 pour midi) :

1- requête intermediaire

L'objectif de la requête est de déterminer tous les appels à ne pas prendre
en compte :
- on effectue une jointure de Appels sur elle-même d'après l'id_client et
date_recept
- on exclue les enregistrements pour lesquels l'écart est inférieur à 20
minutes (la multiplication par 24*60 donne le nombre de minutes)

$intermediaire SELECT Appels.id_client, Appels.date_recept, Appels_1.heure_recept
FROM Appels INNER JOIN Appels AS Appels_1 ON Appels.id_client Appels_1.id_client AND Appels.date_recept = Appels_1.date_recept
WHERE (appels_1.heure_recept-Appels.heure_recept)*24*60>0 And
(appels_1.heure_recept-Appels.heure_recept)*24*60<
ORDER BY Appels.id_client, Appels.date_recept, Appels_1.heure_recept;

2- la requête finale

On sélectionne tous les enregistrements de la table Appels qui ne sont pas à
exclure, ie qui ne se trouvent pas dans la requête précédente.
- la jointure a lieu sur id_client, date et heure d'appel (on suppose qu'un
client ne peut pas effectuer deux appels à la même date et même heure)
- on émule l'opération NOT IN non reconnu par MySQL par le maintenant
célèbre idiôme LEFT JOIN + valeur nulle ;) - il y a un fil à ce sujet qui
date de quelques jours...

SELECT Appels.id_client, Appels.date_recept, Appels.heure_recept
FROM Appels LEFT JOIN intermediaire ON Appels.id_client = intermediaire
.id_client AND Appels.date_recept = intermediaire .date_recept AND
Appels.heure_recept = intermediaire .heure_recept
WHERE intermediaire .id_client is null
AND date_recept > UNIX_TIMESTAMP('$date_deb')
AND date_recept < UNIX_TIMESTAMP('$date_fin')


Voilà, bonne migraine ;)
Chris