Casse tête SQL

Petit nouveau ! | 8 Messages

16 oct. 2005, 15:27

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

Mammouth du PHP | 19672 Messages

16 oct. 2005, 15:47

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. :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 1024 Messages

16 oct. 2005, 18:54

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

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

16 oct. 2005, 19:31

Très astucieux !
Bravo, Pascaltje, fallait la trouver, cette fonction-là. :shock: =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. :ordi:

Petit nouveau ! | 8 Messages

16 oct. 2005, 20:12

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.

ViPHP
ViPHP | 1024 Messages

16 oct. 2005, 20:24

Très astucieux !
Bravo, Pascaltje, fallait la trouver, cette fonction-là. :shock: =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)

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

16 oct. 2005, 21:08

:arrow: Pascaltje : la fonction Coalesce() ne nécessite-t-elle pas MySQL 5 ?

:arrow: gdrara : quelle version de MySQL utilises-tu ?

ViPHP
ViPHP | 1024 Messages

16 oct. 2005, 21:14

:arrow: 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

Petit nouveau ! | 8 Messages

16 oct. 2005, 21:26

j'utilise la 4.1.9
je vais regarder la doc, mais je suis un peu dans le flou là ...

Petit nouveau ! | 8 Messages

16 oct. 2005, 21:37

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

ViPHP
ViPHP | 1024 Messages

17 oct. 2005, 09:01

dans ce que tu as copié, la syntaxe est bonne. est tu sûr de ta requête?

A+

Pascal