Casse tête SQL

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Casse tête SQL

par pascaltje » 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

par gdrara » 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

par gdrara » 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à ...

par pascaltje » 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

par albat » 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 ?

par pascaltje » 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)

par gdrara » 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.

par albat » 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:

par pascaltje » 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

par Cyrano » 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

Casse tête SQL

par gdrara » 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