Requête complexe

Requête complexe - SQL/NoSQL - Programmation

Marsh Posté le 31-01-2008 à 13:59:33    

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

Reply

Marsh Posté le 31-01-2008 à 13:59:33   

Reply

Marsh Posté le 31-01-2008 à 14:21:12    

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 -
Reply

Marsh Posté le 31-01-2008 à 14:27:49    

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
Reply

Marsh Posté le 31-01-2008 à 14:30:19    

pas de manière standard.


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

Marsh Posté le 31-01-2008 à 14:32:41    

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 ?

Reply

Marsh Posté le 31-01-2008 à 14:33:53    

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 -
Reply

Marsh Posté le 31-01-2008 à 14:36:30    

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 ?

Reply

Marsh Posté le 31-01-2008 à 14:39:32    

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 -
Reply

Marsh Posté le 31-01-2008 à 14:40:10    

Effectivement
Merci de ton aide Skeye :)

Reply

Marsh Posté le 31-01-2008 à 14:46:01    

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.

Reply

Marsh Posté le 31-01-2008 à 14:46:01   

Reply

Marsh Posté le 31-01-2008 à 14:46:59    

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

Reply

Marsh Posté le 31-01-2008 à 14:48:33    

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 -
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed