Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1267 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Requête complexe

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Requête complexe

n°1679680
yellu
Posté le 31-01-2008 à 13:59:33  profilanswer
 

Bonjour à tous,
 
J'ai une problématique sur un site de petites annonces.
Les annonces devant portés sur tout et n'importe quoi, nous avons optés pour des critères d'annonces dynamiques, je m'explique :
 
Nous avons une table ANNONCE ayant un ID, une date, une clé de catégorie et une clé de client
Nous avons une table de critère ayant un ID et un nom de critère
Enfin une table lie les catégorie au critère grace a l'ID categorie et à l'ID critère.
 
ANNONCE
ID | DATE | CATEGORIE_ID | CLIENT_ID
 
CATEGORIE
ID | NOM
 
CRITERE
ID | NOM
 
CATEGORIE_DEFINITION
CATEGORIE_ID | CRITERE_ID
 
VALEUR
ANNONCE_ID | CRITERE_ID | TEXTE
 
CLIENT
ID | NOM | PRENOM
 
La problématique se situe lorsque l'on veux lister les annonces d'une catégorie.
 
Je souhaite créer un tableau ayant une colonne par critère, et pouvoir effectuer des opération de tri sur celle ci.
 
J'arrive à faire cela mais en m'aidant d'un langage additionnel (PHP).
 
Pensez vous que c'est faisable en SQL uniquement ?
 
PS : J'utilise mySQL
 
Merci d'avance

mood
Publicité
Posté le 31-01-2008 à 13:59:33  profilanswer
 

n°1679701
skeye
Posté le 31-01-2008 à 14:21:12  profilanswer
 

en sql uniquement, un tableau et des tris sur un tableau? par quel miracle? Soit je ne comprends pas la question, soit tu ne comprends pas ce que fait le sql.


Message édité par skeye le 31-01-2008 à 14:21:50

---------------
Can't buy what I want because it's free -
n°1679708
yellu
Posté le 31-01-2008 à 14:27:49  profilanswer
 

J'ai mal posé la question :
 
Est-il possible en une requête SQL de ramené un recordset capable lui seul de construire le tableau via un bouclage simple d'un langage type PHP.
 
c'est à dire un recordset dont les lignes serait :
 
ANNONCE_ID | Puissance | Année | Prix
13 | 100ch | 2002 | 20000
16 | 120ch | 2003 | 45000
 
Car moi pour obtenir ce resultset je passe par un resultset comme celui ci :
ANNONCE_ID | CRITERE_NOM | VALEUR
13 | Puissance | 100ch
13 | Année | 2002
13 | Prix| 20000
16 | Puissance | 120ch
16 | Prix | 45000
16 | Année | 2002
 
Et via un traitement PHP je reformate pour obtenir le bon format, mais du coup je ne peut pas effectuer de ORDER BY ou de LIMIT sur ma requete.
 
Donc ma question est juste : est il possible d'obtenir le premier resultset avec uniquement du SQL ?
 
Merci d'avance


Message édité par yellu le 31-01-2008 à 14:29:24
n°1679710
skeye
Posté le 31-01-2008 à 14:30:19  profilanswer
 

pas de manière standard.


---------------
Can't buy what I want because it's free -
n°1679712
yellu
Posté le 31-01-2008 à 14:32:41  profilanswer
 

Merci pour ce premier élément de réponse.
Pourrai tu m'orienter vers une solution ?
Pour l'instant je vais continuer a gérer avec PHP derrière mais ça m'oblige a faire une requete qui prend l'intégralité des annonces à chaques fois et j'ai peur pour les temps de chargement de la page qd le volume arrivera ...
 
Je pourrai aussi créer des table de préformattage de données (une pour chaque catégorie) ou encore des vues.
 
Est ce une bonne piste ?

n°1679714
skeye
Posté le 31-01-2008 à 14:33:53  profilanswer
 

yellu a écrit :

Merci pour ce premier élément de réponse.
Pourrai tu m'orienter vers une solution ?
Pour l'instant je vais continuer a gérer avec PHP derrière mais ça m'oblige a faire une requete qui prend l'intégralité des annonces à chaques fois et j'ai peur pour les temps de chargement de la page qd le volume arrivera ...
 
Je pourrai aussi créer des table de préformattage de données (une pour chaque catégorie) ou encore des vues.
 
Est ce une bonne piste ?


Comment ça tu es obligé de prendre l'intégralité des annonces?[:pingouino]
Si tu n'en veux qu'une partie tu n'en prends qu'une partie...:o


---------------
Can't buy what I want because it's free -
n°1679716
yellu
Posté le 31-01-2008 à 14:36:30  profilanswer
 

Si l'internaute veux trier selon le critere "Modèle", la table annonce ne me permet à elle seule de limiter le resultset en quantité renvoyé.
 
Donc je prend tout, et je trie au niveau des "Array" PHP que je construit dynamiquement.
 
Ou alors tu me fais réfléchir au fait que je pourrai faire une premiere requete sur Annonce avec une jointure seulement sur le critere de Modele pour recupere les ID des X premiers puis ensuite faire une requete complete sur ces ID la !
 
Non ?

n°1679719
skeye
Posté le 31-01-2008 à 14:39:32  profilanswer
 

yellu a écrit :

Si l'internaute veux trier selon le critere "Modèle", la table annonce ne me permet à elle seule de limiter le resultset en quantité renvoyé.
 
Donc je prend tout, et je trie au niveau des "Array" PHP que je construit dynamiquement.
 
Ou alors tu me fais réfléchir au fait que je pourrai faire une premiere requete sur Annonce avec une jointure seulement sur le critere de Modele pour recupere les ID des X premiers puis ensuite faire une requete complete sur ces ID la !
 
Non ?


 
Tu peux aussi utiliser des sous-requêtes :
 
select ...
from annonce, critere, ...
where annonce_id in (select id_annonce from critere where critere_nom='modele' and  valeur ='jolimodele')

 
select a.*, c2.*
from annonce a, critere c, critere c2
where  a.annonce_id = c.annonce_id
and     c.critere_nom = 'modele'
and     c.valeur = ...
and     c2.annonce_id = a.annonce_id


Message édité par skeye le 31-01-2008 à 14:58:38

---------------
Can't buy what I want because it's free -
n°1679720
yellu
Posté le 31-01-2008 à 14:40:10  profilanswer
 

Effectivement
Merci de ton aide Skeye :)

n°1679726
MagicBuzz
Posté le 31-01-2008 à 14:46:01  profilanswer
 

Tu trouveras toujours des solutions batardes pour le faire, surtout en MySQL.
 
Mais ne cherche pas, c'est pas au SGBD de s'occuper de ça (cf. ma signature)
Le résultat que tu reçois actuellement est le résultat que tu dois récupérer.
 
Si vraiment tu as toujours la même liste de critères, en faisant une jointure sur la table critère par critère possible, tu pourras ramener autant de colonnes que de critères, sans pour autant faire du SQL non standard. Ceci dit, cela va multiplier les lectures dans la base, ce qui n'est pas une bonne idée en ce qui concerne les performances... D'autant que la table qui liste les valeurs des critères est certainement la plus grosse de ta base, donc c'est ridicule d'y accéder plusieurs fois pour chaque ligne de ta requête.

mood
Publicité
Posté le 31-01-2008 à 14:46:01  profilanswer
 

n°1679727
MagicBuzz
Posté le 31-01-2008 à 14:46:59  profilanswer
 

euh, non, des jointures suffises, la méthode de skeye est pire :D

n°1679729
skeye
Posté le 31-01-2008 à 14:48:33  profilanswer
 

MagicBuzz a écrit :

euh, non, des jointures suffisent


putain mais faut que je dorme la nuit, moi...[:pingouino]


Message édité par skeye le 31-01-2008 à 14:48:39

---------------
Can't buy what I want because it's free -

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Requête complexe

 

Sujets relatifs
[SQL] Requête UPDATE complexeRequête SQL "complexe"
champs un peu complexe à traiter dans requete[MYSQL] Requete complexe
Requête complexe : probable jointure externePB sur résultat de requête dite complexe...
GROUP BY ou DISTINCT sur une requête complexe[Résolu] Requête complexe sur table ayant 4 champs clé primaire
Geolocalisation et requête assez complèxeRequete mysql complexe
Plus de sujets relatifs à : Requête complexe


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR