|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Membre actif
![]() Inscription : décembre 2003 Messages : 415 ![]() |
Bonjour,
Je vais vous expliquer la situation littéralement, puis je vous fourni le schéma de test pour plus de compréhension de mon soucis. C'est une situation tout à fait classique, imaginons que la base gère un ensemble de produits rangés dans une catégorie. On a donc un ensemble de catégories, un ensemble de produits et des produits classés dans une (ou plusieurs catégorie). Pour représenter cela on peut avoir le schéma suivant : Code :
Je veux que le select me retourne : cat_id prd_id usr_id associé au prd createDate Idéalement je cherche à faire ça en une requête sans sous-requête. J'étais parti sur quelque chose comme : Code :
J'ai donc besoin de vous. Quelle requête me retournera ce que je cherche ? Mon inquiétude sur le groupage est surtout "comment être sûr que le prd_id et le usr_id retournés sont bien des couples valides" ? J'imagine qu'une auto-jointure doit permettre de résoudre ce simple problème (d'apparence pour moi en tout cas). Mais je ne suis pas assez familier avec les patterns SQL pour pondre la requête moi-même. Je cherche une requête pour le SGBD MySQL. Merci pour votre aide.
__________________
"La théorie, c’est quand on sait tout et que rien ne fonctionne. La pratique, c’est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : rien ne fonctionne ... et personne ne sait pourquoi !" et malheureusement c'est souvent le cas en Développement... |
||||
|
|
00
|
|
|
#2 |
|
Membre émérite
![]() Olivier DehorterIngenieur de recherche - Ecologue Inscription : juin 2003 Messages : 697 ![]() |
première chose : Merci d'avoir mis autant de détails
![]() je penses que cette discussion récente ou celle-ci peuvent t'aider |
|
|
00
|
|
|
#3 | ||
|
Membre actif
![]() Inscription : décembre 2003 Messages : 415 ![]() |
Bonsoir,
Merci pour ta contribution. Donc si je comprends bien, je suis obligé d'utiliser une sous requête. Du coup, ma requête ressemblerait à quelque chose comme : Code :
Merci encore pour ton aide, Et si quelqu'un voit comment faire ça en une requête ... je suis toujours preneur. @ Plus
__________________
"La théorie, c’est quand on sait tout et que rien ne fonctionne. La pratique, c’est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : rien ne fonctionne ... et personne ne sait pourquoi !" et malheureusement c'est souvent le cas en Développement... |
||
|
|
00
|
|
|
#4 | |||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Citation:
Pouquoi sans sous-requête, même avec une (ou des) sous-requête, c'est toujours une seule requête. Qu'est ce que ça donne ? Code :
Et compte tenu de l'écriture de ton 1er GROUP BY dans ta requête exemple je te conseille de lire : http://cedric-duprez.developpez.com/...fier-group-by/ |
|||
|
|
00
|
|
|
#5 | ||||
|
Membre actif
![]() Inscription : décembre 2003 Messages : 415 ![]() |
Bonsoir,
Citation:
Citation:
Cela dit, merci pour ta contribution
__________________
"La théorie, c’est quand on sait tout et que rien ne fonctionne. La pratique, c’est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : rien ne fonctionne ... et personne ne sait pourquoi !" et malheureusement c'est souvent le cas en Développement... |
||||
|
|
00
|
|
|
#6 | ||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Citation:
Citation:
Un exemple des données dans les tables et du résultat souhaité serait le bien venu. |
||
|
|
00
|
|
|
#7 | |||||
|
Membre actif
![]() Inscription : décembre 2003 Messages : 415 ![]() |
Citation:
En fait quand je dis que le critère usr_id n'a aucune influence, je veux dire qu'il ne peut pas être utilisé pour du groupage ou quoi que ce soit (critère de where ou de having). Quand je dis "récupérer le bon couple" j'entends que je souhaite récupérer le bon usr_id associé au prd_id concerné. Prends le problème comme je l'ai expliqué littéralement, on est dans quelque chose d'assez classique. usr_id me sert juste à savoir qui a créée le produit ... aucun intérêt dans la recherche ici. Un exemple : Code :
Le résultat attendu sont les couples : Code :
Encore merci pour ton investissement
__________________
"La théorie, c’est quand on sait tout et que rien ne fonctionne. La pratique, c’est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : rien ne fonctionne ... et personne ne sait pourquoi !" et malheureusement c'est souvent le cas en Développement... |
|||||
|
|
00
|
|
|
#8 | |||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Effectivement je comprends mieux ta requête, il manquait juste une condition de jointure :
Code :
Citation:
C'est au client de dire ce qu'il souhaite voir affiché (le max(prd_id) ou le min(prd_id)), en attendant afficher tous les prd_id ayant la même date me semble cohérent. Concernant les perfs tu peux créer un index sur _test_prd(prd_id,createDate) pour booster la sous-requête : Code :
CREATE INDEX idx_test_prd_date ON _test_prd (prd_id,createDate) |
|||
|
|
00
|
|
|
#9 |
|
Membre actif
![]() Inscription : décembre 2003 Messages : 415 ![]() |
Bonjour,
Bon, si je comprends bien, en une seule requête ça ne semble pas possible ... tant pis. Ok merci pour ton aide, pour le coup des "multiples produits à la même date" le fait est qu'il me faut le dernier enregistré (LE, une seule et unique entrée), je vais donc me baser sur le prd_id. Pour l'index (prd_id, createDate) c'est ce que je vais mettre en place oui. Merci pour ta contribution (Je laisse en non résolu, au cas ou quelqu'un passe par là et connaisse la solution en un seul coup (sans sous requête)).
__________________
"La théorie, c’est quand on sait tout et que rien ne fonctionne. La pratique, c’est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : rien ne fonctionne ... et personne ne sait pourquoi !" et malheureusement c'est souvent le cas en Développement... |
|
|
00
|
|
|
#10 | |||||
![]() ![]() |
Citation:
Si vous voulez masquer la sous-requête incluse dans le from, il suffit de l'encapsuler dans une vue (je n'ai lu la solution technique qu'en diagonale, je prends donc la dernière requête : je vous laisse adapter si ce n'est pas la bonne) : Code :
Code :
__________________
Email : http://scr.im/waldar |
|||||
|
00
|
|
|
#11 |
|
Membre actif
![]() Inscription : décembre 2003 Messages : 415 ![]() |
Bonjour,
Effectivement, le bon terme est plutôt "sans requête imbriqués". La solution de la VIEW, si je ne m'abuse, n'est finalement qu'une manière de noyer le poisson dans l'eau (pour ma demande on est bien d'accord, je ne dis pas qu'une vue n'a pas d'intérêt). Car, arrêtez-moi si je me trompe, lorsque l'on interroge une vue, la requête définissant cette vue est exécutée en live. Donc identique à l'utilisation de requêtes imbriquées ... non ? Quoi qu'il en soit, pour mon soucis initial, j'ai modifié ma façon de procéder en "dénormalisant la BDD". J'ai une SP bien identifiée et obligatoire pour l'ajout d'un produit dans une catégorie. J'ai donc ajouté une colonne à ma table _test_cat qui contient une référence sur le dernier produit ajouté => recherche plus rapide. Merci pour l'intervention.
__________________
"La théorie, c’est quand on sait tout et que rien ne fonctionne. La pratique, c’est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : rien ne fonctionne ... et personne ne sait pourquoi !" et malheureusement c'est souvent le cas en Développement... |
|
|
01
|
|
|
#12 | |
![]() ![]() |
Citation:
C'est une syntaxe acceptable et largement utilisée en SQL.
__________________
Email : http://scr.im/waldar |
|
|
00
|
|
|
#13 | |
|
Membre actif
![]() Inscription : décembre 2003 Messages : 415 ![]() |
Citation:
Le problème étant là que, pour faciliter la compréhension de ma question, j'ai nécessairement simplifié les choses. En situation, il s'avère que cette requête est déjà une requête imbriquée et que les tables visées sont "relativement" (tout est relatif ...) conséquentes. Question performances donc, si il était possible de faire ça directement via une jointure spécifique (pattern SQL, je pensais à de l'auto-jointure) ... et bien c'était toujours plus avantageux que d'exécuter une requête complète.
__________________
"La théorie, c’est quand on sait tout et que rien ne fonctionne. La pratique, c’est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : rien ne fonctionne ... et personne ne sait pourquoi !" et malheureusement c'est souvent le cas en Développement... |
|
|
|
00
|
|
|
#14 | ||
![]() ![]() |
J'ai lu rapidement mais ceci est à proscrire :
Citation:
Citation:
Avec des tables correctement indexées, les requêtes proposées ne devraient pas poser de problème de performance.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
00
|
|
|
#15 | |
|
Membre actif
![]() Inscription : décembre 2003 Messages : 415 ![]() |
Bonjour,
Citation:
Niveau taille de la table ... je ne sais pas trop comment te répondre dans le sens où, comme je le dis un peu précédemment, en réalité la requête est déjà une sous-requête et fait intervenir je pense une bonne dizaine de INNER JOIN (avec certaines tables en double). Certaines de ces tables contenant 800k entrées. Alors oui je suis d'accord ce n'est pas énorme (d'où mon tout est relatif), mais cette quantité va croître au fur et à mesure du temps et, pour le moment, mes ressources sont malheureusement limitées (une seule et unique base pour maître et slave, nombre de serveurs limités, ...). Ainsi, l'autre gros avantage que j'ai à ajouter cette référence est que je ne suis plus dépendant de la croissance des tables (cette requête s'exécutera théoriquement pratiquement toujours en un même temps et ce même après un long temps de production). Je suis bien évidemment ouvert à toute remarque. Si je suis ici avec ma question, c'est que clairement je manque d'expertise dans le domaine et que je recherche ici des avis plus experts.
__________________
"La théorie, c’est quand on sait tout et que rien ne fonctionne. La pratique, c’est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : rien ne fonctionne ... et personne ne sait pourquoi !" et malheureusement c'est souvent le cas en Développement... |
|
|
|
00
|
|
|
#16 |
![]() ![]() |
C'est une dénormalisation qui peut s'envisager mais :
1) Il faut être sûr que les tables concernées par la dénormalisation ne seront jamais mises à jour par une autre procédure que celle prévue pour assurer la cohérence des données (insertion par un autre programme ou directement dans la BDD par exemple). 2) En principe, on dénormalise après avoir essayé toutes les autres solutions, notamment une meilleure indexation, et après avoir constaté un problème de performance, soit par prototypage, soit par constat sur la BDD réellement en production.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
Copyright © 2000-2012 - www.developpez.com