Page 1 sur 1
Casse tête SQL
Posté : 16 oct. 2005, 15:27
par gdrara
Salut à tous
J'ai besoin de vos lumières en sql.
Je suis bloqué sur un soucis : j'ai 2 tables, une table qui contient des produits (avec un id), une autre qui contient la liste des ids des produits en promo.
Je voudrais lister la liste des produits, classé par ordre alphabétique, mais avec les produits en promo en premier.
Je suis sous MySql.
Quelqu'un a une idée ?
Merci bcp
Posté : 16 oct. 2005, 15:47
par Cyrano
La première idée qui me vient, c'est que cette structure est incohérente : pourquoi deux tables alors qu'une seule aurait suffi ? Dans la table produit, il aurait suffi d'un champ supplémentaire avec deux valeurs possibles : 0 ou 1. 0 pour les produits normaux, 1 pour les produits en promo. Ce faisant, tu aurais simplifié ta requête en faisant un
ORDER BY champ_promo DESC.
Avec deux tables, je ne suis pas certain qu'il soit possible de classer ceux en promo d'abord... en tous cas je ne vois pas de solution immédiate.

Posté : 16 oct. 2005, 18:54
par pascaltje
je vois bien une requete du style:
Code : Tout sélectionner
SELECT produit.champs
FROM produit
LEFT join promo ON promo.produit_id = produit.produit_id
ORDER BY COALESCE (promo.produit_id, 0) DESC
en gros: tous les produits avec ou sans promo, avec comme ordre soit produit_id de promo, soit zero si promo.produit_id n'existe pas ( = produit pas en promo )
et ça marche
A+
Pascal
Posté : 16 oct. 2005, 19:31
par albat
Très astucieux !
Bravo,
Pascaltje, fallait la trouver, cette fonction-là.

=D>
Cependant, je rejoins plutôt
Cyrano qui mettait en garde contre une erreur de modélisation.
Que ce soit pour des questions d'optimisation (performances), de maintenance,
de compatibilité (
coalesce() est une fonction propriétaire de MySQL, non ?), etc...
il est de très loin préférable de corriger la structure de la table
produit.

Posté : 16 oct. 2005, 20:12
par gdrara
Merci bcp pour ces conseils. Pour le moment ca ne marche pas :
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in .....
j'aurai besoin que tu m'expliques à quoi sert la fonction COALESCE stp.
Posté : 16 oct. 2005, 20:24
par pascaltje
Très astucieux !
Bravo,
Pascaltje, fallait la trouver, cette fonction-là.

=D>
oh merci, je fais ça à longueur de journées!
fausse modestie
COALESCE(var1, var2, ... ,varN) va renvoyer la première variable non NULL parmi var1, var2, varN .
bon, pour le débuggage:
- teste la requete sous un programme tel que phpMyadmin
- dès que ça marche, fait la démarchze classique:
connection au serveur
choix de la base
exécution de la requete et recupération de l'id de résultat
parcours des résultats d'après l'id de résultat.
en cas de problème sur la requete, montre la nous ainsi que la structure des tables.
A+
Pascal 8)
Posté : 16 oct. 2005, 21:08
par albat
Pascaltje : la fonction Coalesce() ne nécessite-t-elle pas MySQL 5 ?
gdrara : quelle version de MySQL utilises-tu ?
Posté : 16 oct. 2005, 21:14
par pascaltje
Pascaltje : la fonction Coalesce() ne nécessite-t-elle pas MySQL 5 ?
non, c'est supporté sur ma version qui est: version 4.0.15
et pour info, coalesce se retrouve pour pas mal de sgbd:
http://sqlpro.developpez.com/cours/sqlaz/fonctions/
( dans 1.3. Fonctions générales )
A+
Pascal
Posté : 16 oct. 2005, 21:26
par gdrara
j'utilise la 4.1.9
je vais regarder la doc, mais je suis un peu dans le flou là ...
Posté : 16 oct. 2005, 21:37
par gdrara
Ci joint le résultat dans phpmyadmin. Marche pas. Comprends pas trop :
La table club contient la liste des produits, vitrine les produits en promo. Je sais, l'archi de la base peut être bizarre, mais il y a plusieurs promos sur un produit, donc ...
SELECT *
FROM club
LEFT JOIN vitrine ON vitrine.Id_Club = club.Id_Club
ORDER BY COALESCE( vitrine.Id_Club, 0 ) DESC
LIMIT 0 , 30
MySQL a répondu:
#1064 - Erreur de syntaxe pr賠de '(vitrine.Id_Club, 0) DESC LIMIT 0, 30' ࠬa ligne 1
Posté : 17 oct. 2005, 09:01
par pascaltje
dans ce que tu as copié, la syntaxe est bonne. est tu sûr de ta requête?
A+
Pascal