|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||||||
|
Invité de passage
![]() Inscription : juillet 2010 Messages : 11 ![]() |
Bonjour,
Je m'initie (non sans mal) à MySQL (et autre) et je suis en train de développer un petit projet perso (en local pour moi, donc sans trop se poser des questions de sécurité) et je suis tombé sur un "petit" os ... pour vous l'expliquer, il faudrait que je rentre dans le détails de ma base de données, comment celle-ci doit fonctionner et ça prendrais pas mal de temps. Donc j'ai décidé de prendre un exemple plus simple pour vous exposer mon petit "souci"... Un graph vaut mieux que de long discours : ![]() Dans cette base, des utilisateurs peuvent aimer une ou plusieurs couleurs, conduire un ou plusieurs véhicules et détester un ou plusieurs fromages ... Les tables d'associations contiennent donc une ou plusieurs lignes pour chaque utilisateur. Dans chaque table, ligne associe l'id_user avec un (ou plusieurs) id_couleur, id_vehicule et id_fromage. Le code SQL est le suivant : Code :
Maintenant la requête pour sélectionner l'utilisateur 3 (par exemple ROBERT) : Code :
Code :
Code :
Code :
Y'a-t-il moyen d'obtenir, à l'aide de mysql ou php, un tableau avec UNE SEULE LIGNE ? : Code :
Je me dis aussi que je dois pas être le premier à tomber sur un cas pareil et qu'une fonction (en PHP) ou requête m'a échappée ... J'ai essayé de documenter ce post le plus possible pour que si d'autre se pose la question, il trouve la réponse ici (si bien sûr l'un d'entre vous veuille bien se pencher sur le sujet) D'avance merci de m'avoir lu et de vos réponses |
||||||||||||
|
|
00
|
|
|
#2 | ||
![]() ![]() |
Le résultat est normal.
C'est au programme d'arranger les données pour les présenter, pas au SGBD. Donc il faut ordonner le résultat de la requête avec une clause ORDER BY dans la requête puis gérer les ruptures dans le parcours du tableau de résultats en PHP. Tu peux aussi faire ceci : Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. 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 la suite Linux Mageïa ! |
||
|
00
|
|
|
#3 | ||
|
Membre expérimenté
![]() Frédéric Inscription : juin 2011 Messages : 442 ![]() |
Ce n'est pas la meilleure façon de faire (C'est juste pour te montrer le principe du GROUP_CONCAT ) :
Code :
|
||
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() Inscription : juillet 2010 Messages : 11 ![]() |
Merci à vous 2 ... Cela dépasse un peu mon savoir faire ... mais j'apprends !
Je vais tester tous cela au calme et lire la doc' ... Merci particulièrement à CinePhil pour son article sur quand utiliser une table d'association (sur son blog) Très instructif, cela a été le point de départ de ma réflexion pour élaborer ma base de données pour mon projet !! (quand je vois vos requêtes je me dis que SQL, c'est vraiment un monde à part) Je posterais sur ce fil pour d'autres questions meeeeeeeeeeeeerci ! |
|
|
00
|
|
|
#5 |
|
Membre confirmé
![]() ![]() Webmaster Inscription : juin 2005 Messages : 137 ![]() |
Salut,
Ca me rappelle une de mes questions "autres sujet sur le même thème" Il y a une requête d'exemple avec group concat si cela peut t'aider. |
|
|
00
|
|
|
#6 | |||||||
|
Invité de passage
![]() Inscription : juillet 2010 Messages : 11 ![]() |
bon merci à tous et surtout à FRED 34 qui a su mettre en avant une fonctionnalité intéressante (mais pas évidente à comprendre) de MySQL : GROUP_CONCAT ...
Si je peux essayer de "traduire" : lorsque dans un SELECT, il y a un GROUP_CONCAT, MySQL va concaténer les résultats du champs spécifié Dans mon cas (vu qu'il y a un WHERE u.id=3) les couleurs, fromages et voitures se trouve concaténer (séparés par virgules) ... Maintenant, question qui n'attends pas de réponse : "Comment faire sans le WHERE ?" ou "Comment obtenir tous les enregistrements ?" ... en effet si je vire le WHERE alors j'ai une seule ligne de résultats avec toutes les couleurs, tous les fromages et toutes les voitures concaténé (1 fois car il y a le DISTINCT) !!!!! Code :
Réponse : Utiliser le GROUP BY GROUP BY qui groupe les résultats par ... le champs spécifié (par exemple u.nom ou u.id) Ce qui me donne la belle requête ci-dessous (je kiffe le SQL au fait, c'est grave docteur ?) : Code :
Code :
C'est juste super puissant !!!! Si j'avais eu à faire cela en PHP, je vous raconte pas l'horreur ... Moi qui avait trouver une jolie feinte dans mon projet pour me passer de ça .... je vais devoir tout "reconstruire" mais ne dis-t-on pas : Citation:
|
|||||||
|
|
00
|
|
|
#7 |
|
Invité de passage
![]() Inscription : juillet 2010 Messages : 11 ![]() |
Au fait ce GROUP_CONCAT c'est du SQL standard ou c'est spécifique MySQL ?
|
|
|
00
|
|
|
#8 |
![]() ![]() |
Pas SELECT u* mais SELECT u.nom_user car toutes les colonnes du SELECT ne figurant pas dans une fonction de groupage doivent figurer dans le GROUP BY sous peine de récupérer pour les colonnes absentes des résultats aléatoires.
Dans le cas présent, il est probable que ça n'arrivera pas puisque toutes les colonnes de la table des utilisateurs dépendent directement de son identifiant mais si d'aventure tu ajoutes une jointure vers une autre table pour avoir une autre information, c'est le risque de résultat faux qui pointe le bout de son nez ! Et GROUP_CONCAT est spécifique MySQL.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. 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 la suite Linux Mageïa ! |
|
00
|
|
|
#9 |
|
Invité de passage
![]() Inscription : juillet 2010 Messages : 11 ![]() |
Spécifique MySQL ?!! et les autres sql (NoSQL, PostgreSQL, SQL-Server), ils font comment ?
|
|
|
00
|
|
|
#10 |
|
Invité de passage
![]() Inscription : juillet 2010 Messages : 11 ![]() |
|
|
|
00
|
|
|
#11 | |
![]() ![]() |
Voilà une explication supposée par SQLPro de l'existence du GROUP_CONCAT, trouvée sur son blog :
Citation:
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. 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 la suite Linux Mageïa ! |
|
|
00
|
|
|
#12 |
|
Invité de passage
![]() Inscription : juillet 2010 Messages : 11 ![]() |
Whooo je viens de lire son billet sur les normes, je suis en partie d'accord avec lui sur le principe qu'une norme est importante à respecter (c'est même pour cela que j'ai posé la question sur la spécificité de GROUP_CONCAT) mais pour faire évoluer un langage (surtout celui obscur de SQL) et qu'il ne reste pas sectaire, il faut des fonctionnalités "facile" d'accès ...
Moi voulant apprendre le SQL par l'exemple (et mon projet), je n'aurais pas (et ne vais pas) me lancer dans l'utilisation de requêtes récursives mais je vais plutôt utiliser GROUP_CONCAT. Quitte à resté sur MySQL... Dans un second temps, si mon projet devient important et doit est interpolable avec d'autre SGBD, alors oui je ferais en sorte qu'il respecte la norme. Et s'il lit (SQLPro) ce message, je ne me considère pas comme un "techno-crétin" mais plutôt comme un "techno-intéressé" qui cherche à progresser ... Je ne suis pas sûr que son agressivité (sur MySQL par exemple) serve sa cause (respect des normes). On pourrait aussi réfléchir à prendre ce qu'il se fait de bien (mais qui ne respecte pas la norme) dans chaque langage pour justement définir une norme plus évoluée ... Je remarque, ne venant pas du monde de SQL, qu'un cas d'école comme celui-là amène une solution technique plutôt compliquée s'il l'on veux faire les choses bien (requêtes 'récursives' pour traiter des données avec tables d'associations qui doivent être légion dans l'utilisation de base de données) |
|
|
00
|
|
|
#13 |
|
Invité de passage
![]() Inscription : juillet 2010 Messages : 11 ![]() |
J'ai un doute et excusez moi encore de déterre ce post mais imaginons qu'un utilisateur ne soit pas relie à une table d'association m'a requête ne va pas me le renvoyer ...
Albert aime le bleu le rouge et le marron, il conduit un velib et un f16 mais aime bien tous les fromages (par d'entrée dans la te le déteste) Il ne va pas ressortir dans mes résultats, il existe un moyen en sql de l'inclure dans les résultats de la requête précédente ? |
|
|
00
|
|
|
#14 | ||||||||
|
Invité de passage
![]() Inscription : juillet 2010 Messages : 11 ![]() |
Requête pour ajouter Albert (id=5):
Code :
Code :
Code :
Trêve de plaisanterie ... Je ne vois pas pourquoi il ne me colle pas albert dans les résultats avec un joli NULL dans la colonne GROUP_CONCAT(DISTINCT f.nom_fromage) J'ai essayer avec un where u.id=5 entre les inner join et le group by, c'est pareil ! Sans le GROUP BY mais avec le WHERE j'ai albert mais les group_concat tous NULL ... je suis un peu perdu là ! même ça ne me renvoi jamais Albert : Code :
|
||||||||
|
|
00
|
|
|
#15 | ||
![]() ![]() |
Alors il faut des jointures externes :
Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. 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 la suite Linux Mageïa ! |
||
|
00
|
|
|
#16 |
|
Invité de passage
![]() Inscription : juillet 2010 Messages : 11 ![]() |
YES .... thank you
Je vais de ce pas chercher la différence entre jointure externe et jointure avec INNER JOIN ... Merci |
|
|
00
|
|
|
#17 |
|
Invité de passage
![]() Inscription : juillet 2010 Messages : 11 ![]() |
Le SQL ça rulez !!!! Oh boudiouuuuuuu c'est juste trop puissant .... Merci du coup de main : j'ai fini mon projet, c'est sûrement pas terrible au point de vue programmation mais c'est fonctionnel !!!
D'ailleurs si je poste mon projet quelque part (où d'ailleurs ?) je pourrais avoir des commentaires sur le projet ? |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com