Problème de sous requêtes

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 : Problème de sous requêtes

par Nkubi » 13 avr. 2005, 11:35

Merci beaucoup,

Ca semble répondre exactement à mon problème. Au départ je n'allais encore pas séparé les catégories et les marques mais ta démonstration me montre que c'est ce qu'il y avait de mieux à faire.

Encore merci.

Nkubi.

par sadeq » 13 avr. 2005, 09:00

J'ai compris maintenant,
Je te propose un modèle relationnel qui peut te guider :

Selon ce que tu disais :
... tous les produits d'une marques dont la catégorie était "clés_usb" par exemple en sachant qu'une marque pouvait appartenir à d'autres catégories. ...
Le mieux est de répertorier les produits par catégorie et par marque
Ce qui se lit :
Catégorie ---n---> Produit --- 1---> Marque
et
Marque ---n---> Produit ---1---> Catégorie

Ce qui veut dire qu'une catégorie définit plusieurs produits dont chacun a une marque bien définie.
Et une marque définit plusieurs produits dont chacun a une catégorie.

De plus la table Catégorie permet de stocker toutes les catégories (uniques) et la table Marque stocke les marques (uniques)
La table produit a donc deux relations fonctionnelles : marque et catégorie.

L'avantage aussi d'avoir ces tables est de pouvoir construire des listes de choix d'aide à la saisie d'informations se référant aux catégories et aux marques.

Les deux relations permettront le regroupement des produits par catégorie et/ou par marque.

Le modèle est :
Catégorie (code int, nom varchar(30), primary key(code))
Marque(code int, nom varchar(30), primary key(code))
Produit (ref int, designation varchar(30), prix double, stock int, marque int, categorie int, primary key(ref))

Les champs marque et categorie de la table produit permettent la liaison avec les clé primaires des tables Marque et Catégorie.

Test du modèle :
Le modèle doit répondre à ta question (et aux autres besoinss d'ailleurs)
Q1. Je veux afficher tous les produits d'une marque (?) dont la catégorie était "clés usb"

R1. SELECT * FROM Marque m, Produit p, Catégorie c
WHERE c.code = p.categorie AND m.code = p.marque
AND m.nom = ? AND c.nom = "clés usb"

Q2. Je veux afficher les produits d'une catégorie classés par nom de marque
R2. SELECT c.code, c.nom, m.code, m.nom, ref, designation, prix, stock
FROM Marque m, Produit p, Catégorie c
WHERE c.code = p.categorie AND m.code = p.marque
AND c.nom = "clés usb"
ORDER BY m.nom

....

par Invité » 12 avr. 2005, 13:31

D'abord tu n'a pas mentionné quel type de serveur SQL t'as.
Si c'est MySQL, saches que tu dois avoir au moins la version 4.x et supérieure pour supporter les sous-requêtes.

Deuxièment, ta requête est fausse parcequ'elle compare le champ pere au champ nomprod, il faut écrire :
'SELECT nomprod, texte, nomimg, prix, pere FROM produit WHERE nomprod IN (SELECT nomprod FROM produit WHERE pere = "cles_usb" )'

Sachant que le champ avant IN doit correspondre au champ après SELECT de la sous-requête.

MAIS MAIS MAIS, ce n'est pas logique tout ça,
ta requête est compliquée, elle est équivalente à celle-ci :
'SELECT nomprod, texte, nomimg, prix, pere FROM produit WHERE pere = "cles_usb" '

Don je ne vois pas pourquoi tu utilise une requête imbriquée.
Essaye de mieux expliquer ton objectif en donnant le chèma de ta(es) table(s)
Merci
C'est bien ce que je pensais.
Bah en fait il n'y a qu'une seule table avec les champs nomprod et pere qui sont obligatoires. Et en fait si le reste est rempli c'est les produits que je dois affiché. Et si ce n'est pas rempli, cela signifie que c'est une marque d'un produit.
Donc dans cette requête je voulais afficher tous les produits d'une marques dont la catégorie était "clés_usb" par exemple en sachant qu'une marque pouvait appartenir à d'autres catégories.
La sous requête n'était donc pas la solution qu'il me fallait. Il va Falloir que l'on repense complètement la base de données alors.

Nkubi.

par sadeq » 12 avr. 2005, 13:02

D'abord tu n'a pas mentionné quel type de serveur SQL t'as.
Si c'est MySQL, saches que tu dois avoir au moins la version 4.x et supérieure pour supporter les sous-requêtes.

Deuxièment, ta requête est fausse parcequ'elle compare le champ pere au champ nomprod, il faut écrire :
'SELECT nomprod, texte, nomimg, prix, pere FROM produit WHERE nomprod IN (SELECT nomprod FROM produit WHERE pere = "cles_usb" )'

Sachant que le champ avant IN doit correspondre au champ après SELECT de la sous-requête.

MAIS MAIS MAIS, ce n'est pas logique tout ça,
ta requête est compliquée, elle est équivalente à celle-ci :
'SELECT nomprod, texte, nomimg, prix, pere FROM produit WHERE pere = "cles_usb" '

Don je ne vois pas pourquoi tu utilise une requête imbriquée.
Essaye de mieux expliquer ton objectif en donnant le chèma de ta(es) table(s)

Problème de sous requêtes

par Nkubi » 12 avr. 2005, 12:45

Bonjour,

Ca fait longtemps que je n'avais pas fait de SQl et je rencontre quelques difficultés sur quelque chose d'assez basique.

Si je tape ma requête : "SELECT nomprod FROM produit WHERE pere = "cles_usb"" cela me retourne deux champs ce qui est normal.
Mais je veux comparer ces champs avec un autre, donc j'ai cette fois :
'SELECT nomprod, texte, nomimg, prix, pere FROM produit WHERE pere IN ( SELECT nomprod FROM produit WHERE pere = "cles_usb" )'. Et là sql me dit que j'ai une erreur de syntaxe et je ne sais pas le résoudre vu l'ancienneté de mes connaissances. J'i essayé de taper (SELECT a.nomprod FROM produit a WHERE a.pere = "cles_usb" ) pour la sous-requête mais toujours pareil.

Si quelqu'un pouvait m'aider ce serait bien sympa.


Merci d'avance,

Nkubi.