laubro
Messages postés186Date d'inscriptionjeudi 23 décembre 2004StatutMembreDernière intervention 9 juillet 2013
-
26 juin 2013 à 18:21
jordane45
Messages postés38109Date d'inscriptionmercredi 22 octobre 2003StatutModérateurDernière intervention28 mars 2024
-
9 juil. 2013 à 14:45
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
A voir également:
Faire un chois dans la requete en fonction d'un champ de la table
laubro
Messages postés186Date d'inscriptionjeudi 23 décembre 2004StatutMembreDernière intervention 9 juillet 2013 9 juil. 2013 à 14:05
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
jordane45
Messages postés38109Date d'inscriptionmercredi 22 octobre 2003StatutModérateurDernière intervention28 mars 2024344 9 juil. 2013 à 14:45
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