IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

lister les élements appartenant à un groupe


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2005
    Messages : 219
    Par défaut lister les élements appartenant à un groupe
    Bonjour,

    j'aimerais pouvoir, aussi proprement que possible, sélectionner les lignes d'une table dont la valeur d'un champ appartient à un ensemble de valeurs.

    Moins succinctement : j'ai une table d'objets (pendule, livre, dvd, tee-shirt...), avec divers infos, dont un champ qui indique l'origine de l'objet.
    J'ai une autre table (dans mon idée, mais ce n'est peut-être pas ce qu'il y a de mieux) contenant des noms de groupe dans une colonne et la liste des origines correspondantes dans une autre.
    Par exemple :
    groupe->'grandes villes' | origines->'paris, nice, marseille, lyon'
    groupe->'paca' | origines ->'marseille, toulon, cannes, nice'

    Je souhaite pouvoir afficher les objets appartenant, disons, aux 'grandes villes' (voire à plusieurs groupes).

    Sachant que les groupes sont modifiés souvent (donc pas bonne idée de mettre le groupe directement dans la table de l'objet), est-ce que l'idée de la seconde table est bonne ?
    Dans ce cas, quelle serait la requête la plus propre et rapide (en terme vitesse de traitement) à faire ?
    Sinon, qu'est-ce que je peux faire de mieux ?

    Merci.

  2. #2
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Salut !

    cela dépend de la structure de tes tables... ça serait possible d'avoir un rapide aperçu ?
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2005
    Messages : 219
    Par défaut
    Tout ce qu'il y a de plus simple :

    CREATE TABLE objets (
    ref SMALLINT UNSIGNED NOT NULL PRIMARY KEY,
    nom CHAR(30) NOT NULL,
    descr BLOB,
    entree TIMESTAMP NOT NULL,
    sortie TIMESTAMP,
    lieu CHAR(40) NOT NULL,
    familles SET('a','b','c','d','e') NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

    Je peux utiliser SET pour les familles car, là, il s'agit de catégories fixes.
    Mais, si un objet est à Paris, aujourd'hui il appartient à la catégorie 'grandes villes', 'villes touristiques' et 'ville de gauche' mais demain il pourra également appartenir à la catégorie 'villes très polluées' et 'villes de droite' (et donc plus à 'ville de gauche').

    La table des catégories n'existe pas puisque je ne sais pas encore quelle méthode utiliser.

    J'ai également pensé à faire traiter ça par PHP en utilisant un ARRAY_MERGE puis un IN_ARRAY mais je pense que ce sera moins rapide (?).

  4. #4
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    donc, en fait, si je te comprend bien, ce que tu veux, c'est trouver un schéma de table pour pouvoir établir les relation :

    objet dans un lieu [ce que fait ta table actuelle]
    lieu dans une catégorie

    et avoir la requête pour pouvoir obtenir la relation
    objet dans une catégorie

    sachant que la relation objet/lieu est en n<=>1 (plusieurs objets pour un lieu, mais un seul lieu par objet)
    et la relation lieu/catégorie et en n<=>n (plusieurs lieux dans une catégorie, et plusieurs catégories pour un lieux)

    C'est bien ça ?
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2005
    Messages : 219
    Par défaut
    Exactement.

  6. #6
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    ok

    alors, déjà perso, je te conseillerais (mais c'est tout personnel hein, c'est juste que je trouve que c'est plus pratique ^^)
    de faire deux tables (je connais pas la syntaxe MySQL pour le générer mais je vais te donner le schéma ^^ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    lieux :
    id (entier) PK, en auto-incrémente
    nom (texte, unique de préférence)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    catégories :
    id (entier) PK, en auto-incrémente
    nom (texte, unique de préférence)

    comme ça, tu as la liste de tous les lieux et catégorie, et c'est meilleur pour les performances de stocker des entiers (tailles fixes) à des chaînes

    ensuite, une première table de liaison, qui répertorie la liaison lieux<=>catégorie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    lieu_cat :
    id_cat (entier, FK sur catégories.id)
    id_lieu (entier, FK sur lieux.id)
    puis modifier un peu la table objet pour avoir ce type de table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    objets:
    id (entier) PK, en auto-incrémente
    .
    . (autres champs)
    .
    id_lieu (entier, FK sur lieux.id)
    Je pense que tu vois la structure des tables

    ensuite, pour avoir la relation objet<=>catégorie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT O.id AS obj_id, LC.cat_id
    FROM objets AS O
    <div style="margin-left:40px">INNER JOIN lieu_cat AS LC
    <div style="margin-left:40px">ON O.lieu_id = LC.lieu_id</div></div>
    ensuite, tu peux rajouter des champs de objets si tu veux, et pour rajouter le nom de la catégorie, il te faut faire une petite jointure suppélementaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT O.id AS obj_id, C.name AS cat
    FROM objets AS O
    <div style="margin-left:40px">INNER JOIN lieu_cat AS LC
    <div style="margin-left:40px">ON O.lieu_id = LC.lieu_id
    INNER JOIN catégories AS C
    <div style="margin-left:40px">ON LC.cat_id = C.id</div></div></div>
    S'il y a un point que tu ne comprends pas, n'hésite pas à demander
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 12
    Dernier message: 16/03/2011, 14h07
  2. [AC-2003] Lister les contacts appartenant à une catégorie
    Par bibilolo2 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 06/05/2009, 11h36
  3. Lister les membres d'un groupe active directory
    Par Ludo75 dans le forum VBScript
    Réponses: 1
    Dernier message: 18/06/2008, 18h08
  4. Réponses: 12
    Dernier message: 14/05/2008, 17h15
  5. lister les administrateur d'un groupe sur un pc
    Par FalConX dans le forum VBScript
    Réponses: 1
    Dernier message: 19/07/2006, 00h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo