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

Langage SQL Discussion :

Sélection des enregistrements correspondant à un id


Sujet :

Langage SQL

  1. #1
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut Sélection des enregistrements correspondant à un id
    Bonjour,

    J'ai une table qui associe les enregistrements de deux autre tables.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    +-----------------------+
    | id_demande | id _user |
    +-----------------------+
    |       1    |    5     |
    |       1    |    8     |
    |       2    |    1     |
    +-----------------------+
    J'aimerais avoir en résultat: 1 => {5, 8} et 2 => {1} (traitement php derrère)
    et non pas 1 => 5, 1 => 8, 2 => 1.

    Y a-t-il une solution?
    Merci

  2. #2
    Développeuse forum
    Avatar de Atomya Rise
    Femme Profil pro
    Développeuse Web
    Inscrit en
    Février 2009
    Messages
    443
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeuse Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2009
    Messages : 443
    Points : 1 407
    Points
    1 407
    Par défaut
    tu mets ton résultat php dans un tableau php
    Ensuite, tu utilise la fonction serialize qui transforme ton tabelau en chaine de caractère qui peut être mis en base de donnée

    Et ton champ SQL sera de type VACHAR (255 ou 2000 selon la taille dont tu as besoin) ayant comme valeur par defaut a:0:{}

  3. #3
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Merci pour la réponse mais je n'ai surement pas été assez précis: je souhaite trouver une requête SQL qui me renvoit ces résultats, sachant que mon tableau est celui fourni.

    Pour l'instant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $query = "SELECT table_2.id_demande, table_2.id_user
               FROM table_1, table_2
    	   WHERE table_2.id_demande = table_1.id_demande && table_1.id_user = ".quote($id);
    Me retourne ce que j'ai dit plus haut (répétition des id_demande).
    Mais je ne sais pas si ce que je veux faire est possible.

  4. #4
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Finalement j'ai simplement récupéré le nombre de lignes pour un id_demande donné.

    Mais j'ai une autre question: je retire par une autre requête plein d'infos selon un clause WHERE de la table 1.
    Au retour j'ai donc:
    Array(
    'id_demande' => 1,
    'champ 1' => 'valeur 1',
    'champ 2' => 'valeur 2'
    );
    Mon autre requête me renvoie quant à elle (par exemple):
    Array(
    1 => 2, // id_demande => COUNT
    7 -> 3
    )
    Moi j'aimerais bien dans un même requête retourner:
    Array(
    'id_demande' => 1,
    'champ 1' => 'valeur 1',
    'champ 2' => 'valeur 2',
    'count' => mon_count
    );
    Etant donné "la complexité" des deux requêtes, je ne vois pas si je peux les fusionner... Est-ce possible sur un exemple simple?

    Merci

  5. #5
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Les jointures s'écrivent depuis 20 ans avec l'opérateur JOIN. Il serait temps de s'y mettre !

    Ce que vous essayez de faire est de la cosmétique et n'est pas le boulot du SGBD mais celui du logiciel qui présente les données à l'utilisateur.

    Si vous utilisez MySQL, il existe la fonction GROUP_CONCAT qui répondra à votre besoin mais gardez à l'esprit que ce n'est pas une fonction standard SQL et que c'est une mauvaise pratique de l'utiliser plutôt que de traiter la présentation dans le langage de programmation du logiciel utilisateur.

  6. #6
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Anduriel Voir le message
    Finalement j'ai simplement récupéré le nombre de lignes pour un id_demande donné.
    Par contre, le comptage du nombre de lignes, ça c'est le boulot du SGBD !
    Il existe la fonction COUNT, à utiliser conjointement avec GROUP BY pour obtenir, par id, le nombre de lignes.

    Mais j'ai une autre question: je retire par une autre requête plein d'infos selon un clause WHERE de la table 1.
    Au retour j'ai donc:...Etant donné "la complexité" des deux requêtes, je ne vois pas si je peux les fusionner... Est-ce possible sur un exemple simple?
    Bien sûr que c'est possible ! Et même relativement simple... pour celui qui prends la peine d'apprendre un peu le SQL, ce dont vous avez manifestement besoin !

    Donnez, conformément aux règles en usage sur ce forum, la structure de vos tables et une explication claire et concrète de ce que vous voulez obtenir et nous vous aideront à construire la requête.

    Le principe est de faire la requête de comptage puis de faire une jointure sur cette requête pour extraire les autres informations de la ou des tables.

  7. #7
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Bonsoir et merci pour la réponse.

    table1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    id_demande,
    id_user,
    champ3
    table2:
    Un demande peut avoir été manipulée par plusieurs users, d'où la table2.
    Je voudrais savoir combien d'utilisateurs ont manipulé la demande, et récupérer tous les infos la (champ3, ...).

    Voilà où j'en suis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT COUNT(table2.id_user) AS nb_prop, table1.id_demande, table1.champ3
    FROM table2
         JOIN table1
    GROUP BY table2.id_demande
    Mais là (et ça me semble logique vu le code), il me tire tous les tuples dont l'id_demande existe dans table2, et non tous les tuples. J'ai tenté quelques permutations et ajout de conditions plus ou moins hasardeuses, mais sans succès.

    Une petite piste?
    Merci

  8. #8
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Anduriel
    Je voudrais savoir combien d'utilisateurs ont manipulé la demande, et récupérer tous les infos la (champ3, ...).
    Citation Envoyé par CinéPhil
    Le principe est de faire la requête de comptage puis de faire une jointure sur cette requête pour extraire les autres informations de la ou des tables.
    Commençons par la requête de comptage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT id_demande, 
    	COUNT(*) AS nb_manipulateurs
    FROM table2
    GROUP BY id_demande
    Faisons ensuite une jointure de cette requête avec la table1 pour en récupérer les informations complémentaires de chaque id_demande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT t1.id_demande, t1.id_user, t1.col3
    FROM table1 t1
    INNER JOIN
    (
    	SELECT id_demande, 
    		COUNT(*) AS nb_manipulateurs
    	FROM table2
    	GROUP BY id_demande
    ) tmp ON tmp.id_demande = t1.id_demande

  9. #9
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Merci, mais malheureusement ça me retourne strictement la même chose (c'est à dire seulement les tuples dont l'id_demande existe dans table2).

    Par exemple, si table2 contient:
    id_demande | id_user
    1 | a
    1 | b
    2 | c
    et si table1 contient:
    id_demande | id_user | col3
    1 | a' | x
    2 | b' | y
    3 | c' | z
    le SELECT retourne:
    id _demande | nb_manipulateurs
    1 | 2
    2 | 1
    Mais non:
    id _demande | nb_manipulateurs
    1 | 2
    2 | 1
    3 | 0
    Du coup le INNER JOIN ne peut pas me renvoyer les informations de la ligne id_demande = 3.

  10. #10
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Je n'avais pas compris que tu voulais tous les id_demande de table1. Il faut alors une jointure externe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT t1.id_demande, t1.id_user, t1.col3, 
    	COALESCE(tmp.nb_manipulateurs, 0) AS nb_manipulateurs
    FROM table1 t1
    LEFT OUTER JOIN
    (
    	SELECT id_demande, 
    		COUNT(*) AS nb_manipulateurs
    	FROM table2
    	GROUP BY id_demande
    ) tmp ON tmp.id_demande = t1.id_demande

  11. #11
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Merci! Ce n'est pas ce que j'appelle simple dans mon référentiel, mais ça vaut le coup de connaître l'exemple

  12. #12
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Dans ce cas de figure la sous-requête n'est pas nécessaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      SELECT t1.id_demande, t1.id_user, t1.col3
           , COUNT(t2.id_demande) AS nb_manipulateurs
        FROM table1 t1
             LEFT OUTER JOIN table2 t2
               ON t2.id_demande = t1.id_demande
    GROUP BY t1.id_demande, t1.id_user, t1.col3;

  13. #13
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Merci, ça fonctionne aussi très bien !

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

Discussions similaires

  1. [Toutes versions] Sélection des enregistrements avec valeur maximale
    Par damsmut dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 02/03/2011, 14h37
  2. [WD12E] Sélection des enregistrements dans une fenêtre RAD
    Par nambours dans le forum WinDev
    Réponses: 4
    Dernier message: 26/04/2010, 10h16
  3. Sélection des enregistrements du mois M-1 dans Oracle7
    Par Florentin dans le forum Oracle
    Réponses: 8
    Dernier message: 22/05/2009, 20h05
  4. Requête sélection des enregistrements avec une '
    Par Vodjedi dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/04/2009, 17h57
  5. Sélection des enregistrements du mois
    Par vlksoft dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 19/09/2007, 00h36

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