Faire un chois dans la requete en fonction d'un champ de la table [Résolu]

Signaler
Messages postés
186
Date d'inscription
jeudi 23 décembre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
-
jordane45
Messages postés
27350
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 janvier 2020
-
Bonjour à tous

alors j'ai un petit soucis dans le cadre d'une gros moteur de recherche , dans le cadre ou pour un même produit il peut y avoir différents prix eux même dans une table différente
je m'explique :

Un produit va avoir un prix
- public (type client 1)
- Type client 2
- type client 3

et ce dans différent mode de vente (location, pret...) bref, ça pas trop grave

le problème est lorsque je lance la requête de recherche avec un ORDER BY prix ASC/DESC, dans ma table prix je vais devoir, si je suis connecté en tant que "Type client 1", prendre les produit ayant un prix affecté à ce type client mais s'il n'a pas de prix spécial, alors je doit prendre le prix public mais je ne voit pas bien comment faire, car je remonte une liste avec X critères et celui la ma pose problème, alors peut être que je n'ouvre pas bien les yeux mais bon...

exemple de la requete (le problème c'est d.destine)

SELECT DISTINCT t.* FROM videos t INNER JOIN droits_videos d ON t.id=d.id_video INNER JOIN supports_videos s ON t.id=s.id_video WHERE visible=1 AND (t.destine='tous' OR t.destine='mediatheque') AND (genre IN (23,38,44) OR genre2 IN (23,38,44)) AND tarif_ht!=0 AND tarif_ht!='' AND ( d.destine='2' OR d.destine='1' ) AND droits_utilisation=2 ORDER BY CAST(d.tarif_ht AS DECIMAL(5,2)) ASC, t.titre ASC, s.support ASC

Comme je met OR, si le prix public est plus petit que le prix spécial dans ma liste il va afficher ce produit en premier hors il est possible par exemple qu'en public ce soit 10€ et en special 15€, donc il va afficher mon produit entre les 10€ et les 15€ alors qu'il ne devrait venir qu'a partir de 15€

Y a t'il un moyen de dire, si d.destine='2' existe alors c'est le critère sinon d.destine='1' sera le critère .???? et le tout dans la requete, l'idée c'est que s'il trouve un prix pour type client 2 alors il ne cherche plus pour type client 1...

Merci

Laubro

3 réponses

Messages postés
27350
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 janvier 2020
322
Bonjour,

As tu regardé du côté des "CASE WHEN" ?
http://dev.mysql.com/doc/refman/5.0/fr/control-flow-functions.html

Cordialement,
Jordane
_____________________________________________________
Règles du forum à lire avant de poster une question : ICI
Messages postés
186
Date d'inscription
jeudi 23 décembre 2004
Statut
Membre
Dernière intervention
9 juillet 2013

Oui j'avais essayé les CASE WHEN mais j'avais surement pas été au bout de ma reflexion à ce moment là, donc je te remercie de m'avoir remis sur cette priste car a priorie je viens d'y arriver, un poil tiré par les cheveux mais ça semble répondre au besoin... donc....
un peti exemple ça peut en inspirer d'autres :

SELECT DISTINCT t.* FROM videos t INNER JOIN droits_videos d ON t.id= d.id_video INNER JOIN supports_videos s ON t.id=s.id_video WHERE visible=1 AND (t.destine='tous' OR t.destine='mediatheque') AND tarif_ht!=0 AND tarif_ht!='' AND droits_utilisation=2 AND ( SELECT CASE WHEN d.destine='2' THEN true WHEN d.destine='1' and ((select count(u.id_video) from droits_videos as u where u.id_video=t.id and u.destine='2' and u.droits_utilisation=2) < 1) THEN true ELSE false END ) AND id IN ('V01099', 'V24851', 'V29055', 'V41893', 'V07210', 'V09355', 'V09964', 'V12426', 'V12861', 'V24381', 'V24933', 'V32931', 'V33560',) ORDER BY CAST(d.tarif_ht AS DECIMAL(5,2)) ASC, t.titre ASC, s.support ASC

SELECT CASE WHEN d.destine ='2' (si ce code tarif destine 2 existe alors c'est true) THEN true WHEN d.destine ='1' and ((select count(u.id_video) from droits_videos as u where u.id_video=t.id and u.destine='2' and u.droits_utilisation=2) < 1) (si ce code tarif destine 1 existe MAIS AUSSI ET SURTOUT qu'il n'y a pas de code tarif destine 2 alors c'est true) THEN true ELSE false (sinon c'est false : pas du tout de code tarif destine 1 ou 2) END

encore merci pour la piste !!

Laubro
Messages postés
27350
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 janvier 2020
322
De nada ^^

Par contre, si ton sujet est "résolu" pense à le fermer.

PS: Pense à utiliser la coloration syntaxique lorsque tu poste du code, c'est plus lisible... ( Troisième icone en partant de la droite)

SELECT DISTINCT t.* 
FROM videos t 
INNER JOIN droits_videos d ON t.id=d.id_video 
INNER JOIN supports_videos s ON t.id=s.id_video 
WHERE visible=1 
AND (t.destine='tous' OR t.destine='mediatheque')
 AND tarif_ht!=0 
AND tarif_ht!='' 
AND droits_utilisation=2 
AND ( SELECT CASE 
             WHEN d.destine='2' THEN true 
             WHEN d.destine='1' and ((select count(u.id_video) from droits_videos as u where u.id_video=t.id and u.destine='2' and u.droits_utilisation=2) < 1) THEN true ELSE false END )

//Etc....
...



Cordialement,
Jordane
_____________________________________________________
Règles du forum à lire avant de poster une question : ICI