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

 MySQL Discussion :

faire un double select


Sujet :

MySQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Décembre 2008
    Messages : 78
    Points : 31
    Points
    31
    Par défaut faire un double select
    bonjour,

    voilà, après quelques recherches pendant une grosse partie de la matinée et tout le début de l'après-midi, je n'ai rien trouvé comme solution à mon problème. et pourtant, spas faute d'avoir chercher dans les doc du sites etc.. !! ou alors, j'ai de la m* dans les yeux et je cherches très mal (ce qui est possible aussi)

    fin bref, trêve de blablatage, voici mon problème

    j'ai plusieurs tables : fiche_pdt, catalogue etc...

    je souhaiterais faire un select de toute la première table en fonction de la référence excepté un champ qui lui sera sélectionné via une référence et un id déjà existant.

    ce que je pensais donc faire c'était un select d'un select.. mais toute mes tentatives ne fonctionnes pas.

    pour être plus clair, je vais vous mettre ce que j'ai tenté de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select `ref`, `nom`, `age`, `img`, `cdc`, `cdc2`, `buy` 
    from `fiches_pdt` 
    where `ref`=00002 
      and `fiches_pdt`.`txt` = (
        select `txt`, `fin` 
        from `fiches_pdt`, `catalogue` 
        WHERE `fiches_pdt`.`ref` = `catalogue`.`prod_ref` 
          and `ref`=00001 and prod_id = 346);
    peut-être que ma question est vraiment bête, et que la solution est quelque part dans le site et que je n'ai pas trouvé, si c'est le cas, j'en suis désolée et je suis prenante de tout lien pour m'aider

    merci beaucoup

    et si vous ne comprenez pas ce que je souhaite faire, dite-le moi, j'expliquerais autrement

    merci

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Citation Envoyé par rastacouaire Voir le message
    je souhaiterais faire un select de toute la première table en fonction de la référence excepté un champ qui lui sera sélectionné via une référence et un id déjà existant.
    ....
    et si vous ne comprenez pas ce que je souhaite faire, dite-le moi, j'expliquerais autrement
    Cette partie-là, ce serait bien que tu l'explicites.
    Dankon.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Décembre 2008
    Messages : 78
    Points : 31
    Points
    31
    Par défaut
    alors, j'ai ma table fiches_pdt

    cette fiche contient les champs suivant :

    `ref`, `nom`, `age`, `img`, `txt`, `fin`, `cdc`, `cdc2`, `buy`

    à la base c'est utilisé sous php, je souhaites faire une copie d'une entrée de catalogue.

    et donc cette copie récupère des informations de la ligne copié, notamment txt et fin. le reste elle le récupère autrement (déjà fait )

    et donc ma requête sql, pour récupérer les infos à la base est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM fiches_pdt WHERE ref= 00001
    sauf que là, txt et fin sont à récupérer ailleurs.

    la requête toute seule pour récupérer ces deux valeurs, je sais le faire c'est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select `txt`, `fin` from `fiches_pdt`, `catalogue` 
    	WHERE `fiches_pdt`.`ref` = `catalogue`.`prod_ref` and `prod_id`=360
    et donc moi, je souhaiterais faire un mix des deux.

    c'est possible?

    est-ce compréhensible? ou toujours pas? ^^

  4. #4
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    J'essaye de comprendre la logique de ta requête, à défaut de sa syntaxe, mais c'est peine perdue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT `ref`, `nom`, `age`, `img`, `cdc`, `cdc2`, `buy` 
    FROM `fiches_pdt` 
    LEFT JOIN `catalogue` ON `fiches_pdt`.`ref` = `catalogue`.`prod_ref`
    WHERE `ref`=00002 
    AND `fiches_pdt`.`txt` = ????
    AND prod_id = 346;
    Je ne comprends pas par quelle valeur de `fiches_pdt`.`txt` tu veux filtrer.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Décembre 2008
    Messages : 78
    Points : 31
    Points
    31
    Par défaut
    malgré ma deuxième explication? ou sans elle?

    car je crois que nos posts se sont croisé

  6. #6
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Grosso modo tu veux sélectionner tout ce qui a pour valeur '000001' dans la colonne ref mais en remplaçant les valeurs de txt et fin par le résultat d'une requête?

  7. #7
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Décembre 2008
    Messages : 78
    Points : 31
    Points
    31
    Par défaut
    grosso modo oui c'est ça

    c'est valeur existant déjà

  8. #8
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Un truc dans le style devrait faire l'affaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     SELECT 
      f1.ref,
      f1.nom      ,
      f1.age      ,
      f1.img      ,
      f1.cdc      ,
      f1.cdc2     ,
      f1.buy      ,
      f2.txt      ,
      f2.fin      ,
      FROM fiches_pdt f1, fiches_pdt f2
      inner join catalog on f2.ref = catalog.prod_ref
      where f1.ref='00001'
      and f2.prod_id=360

  9. #9
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Décembre 2008
    Messages : 78
    Points : 31
    Points
    31
    Par défaut
    pardon gros rush en ce moment, pas eu le temps de jeter un coup d'œil là dedans

    mais eu, on peut mettre f1, f2, enfin un nom quelconque derrière une table juste comme ça?


    en fait la requête que tu m'as gentillement proposé ne fonctionne pas. ça me met en erreur, peut-être la syntaxe avec la jointure

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    J'avoue que j'ai moi aussi un peu de mal mais voilà ce que je comprends...

    Tu as une table qui regroupe les infos sur les fiches de produits et une table qui contient le catalogue de ces produits.
    fiches_pdt(ref, nom, age, img, cdc, cdc2, buy)
    catalogue(prod_ref, txt, fin, ...) <== J'ai bon là ?

    Tu veux sélectionner toutes les colonnes de fiches_pdt pour la ref = '0001' et les colonnes txt et fin de la table catalogue pour cette même prod_ref.

    Ca s'appelle une jointure et en voici la syntaxe normalisée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT colonnes
    FROM tableA
    INNER JOIN tableB ON condition de jointure du type tableA.colA = tableb.colB
    Dans ton cas, ça donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT f.ref, f.nom, f.img, f.cdc, f.cdc2, f.buy, c.txt, c.fin
    FROM fiches_pdt AS f
    INNER JOIN catalogue AS c ON f.ref = c.prod_ref
    WHERE f.ref = '00001'
    Il manque la restriction :
    prod_id est dans quelle table ?

  11. #11
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par CinePhil Voir le message

    Tu as une table qui regroupe les infos sur les fiches de produits et une table qui contient le catalogue de ces produits.
    fiches_pdt(ref, nom, age, img, cdc, cdc2, buy)
    catalogue(prod_ref, txt, fin, ...) <== J'ai bon là ?
    De ce que j'ai compris c'est plutôt
    fiches_pdt(ref, nom, age, img, cdc, cdc2, buy, txt, fin)
    catalogue(prod_ref, ...)

  12. #12
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Oups ! J'avais pas bien vu là :
    Du coup la table ville, en passant à un niveau international atteint une taille monstrueuse, est ce viable ?


    A quoi sert la jointure avec catalogue alors ?

    Laissons rastacouaire répondre.

  13. #13
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Décembre 2008
    Messages : 78
    Points : 31
    Points
    31
    Par défaut
    pardon oui, je n'ai pas détaillé la table catalogue

    voici la table catalogue :

    prod_id, prod_ref, prod_nom, prod_famille, prod_gamme, prod_url, prod_date

    la table fiches_pdt contient :

    ref, nom, age, img, txt, fin, cdc, cdc2, buy

    j'ai donc une table catalogue avec le nom du produit,sa référence, sa famille, sa gamme son url etc.. et j'ai des fiches de produit qui contiennent la référence , le nom, l'âge, un text début, un texte fin etc...

    ce que je souhaites faire, c'est récupérer les informations txt et fin présent dans fiches_pdt d'une fiche déjà existante sachant que je suis obligé de faire le lien par le prod_id (ceci c'est par rapport à ma requête php)

    donc en gros, jvais essayé de plus détaillé.

    j'ai mon tableau avec tous les entrées du catalogue.
    je fais une copie d'une ligne [de la table catalogue] où là je rentre le nom, la référence. je valide, ce qui m'envoie sur une autre page. j'envoie les données suivantes : prod_nom, prod_ref et prod_id

    prod_id étant l'id de la ligne copié! pas le nouvel id créé par la nouvelle ligne..

    c'est compréhensible jusqu'ici?

    bon je continue

    j'arrive donc sur ma nouvelle page avec ces informations.

    et là je souhaiterais récupéré les txt et fin [de la table fiches_pdt] en fonction de l'id de la ligne copié.
    je veux donc récupérer que le txt et le fin de l'id copié, le reste non.

    est-ce compréhensible?

    et mon soucis, c'est que la requête que j'ai créé, n'affiche rien du tout...

    enfin sauf cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT `txt`, `fin` FROM `fiches_pdt`, `catalogue` 
    	WHERE `fiches_pdt`.`ref` = `catalogue`.`prod_ref` AND `prod_id`=360
    qui elle m'affiche bien la valeur de txt et fin. mais dans le coup, elle ne récupère pas les autres valeurs.

    moi ce que je voudrais c'est qu'avec une requête, je récupère les autres valeurs + plus ces deux valeurs là

    ceci récupérant les autres valeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT `ref`, `nom`, `age`, `img`, `cdc`, `cdc2`, `buy` FROM fiches_pdt WHERE ref= 00001

    ce n'est peut-être pas possible hein, je cherche une solution, mais si ça strouve, ça ne peux pas se faire ^^

    merci pour votre aide

  14. #14
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Il me semble qu'il y a une erreur de conception...
    voici la table catalogue :

    prod_id, prod_ref, prod_nom, prod_famille, prod_gamme, prod_url, prod_date

    la table fiches_pdt contient :

    ref, nom, age, img, txt, fin, cdc, cdc2, buy

    j'ai donc une table catalogue avec le nom du produit,sa référence, sa famille, sa gamme son url etc.. et j'ai des fiches de produit qui contiennent la référence , le nom, l'âge, un text début, un texte fin etc...
    Si je comprends bien, fiches_pdt.ref est la ref du produit figurant dans le catalogue. Autrement dit, fiches_pdt.ref = catalogue.prod_ref.
    Est-ce prod_ref qui est une clé étrangère dans la table catalogue ou ref qui est à la fois clé primaire et étrangère dans la table fiches_pdt ?

    J'ai l'impression que les informations sur les produits sont dans catalogue et que la table fiches_pdt en est en fait une extension, comme si tous les produits figurant dans le catalogue n'avaient pas de fiche et qu'on avait pas voulu alourdir la table catalogue de colonnes avec beaucoup de NULL.

    Si ce que je suppose est exact, fiches_pdt devrait avoir pour clé primaire et étrangère prod_id et non pas ref.

    Sinon même comme ça, une simple jointure devrait suffire à obtenir ce que vous souhaitez.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT f.ref, f.nom, f.age, f.img, f.cdc, f.cdc2, f.buy, f.txt, f.fin
    FROM fiches_pdt f
    INNER JOIN catalogue c ON f.ref = c.prod_ref
    WHERE c.prod_id = 360

  15. #15
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Décembre 2008
    Messages : 78
    Points : 31
    Points
    31
    Par défaut
    ref est une clé primaire dans la table fiches_pdt, et prod_id est une clé primaire dans la table catalogue.

    moi aussi au début quand j'ai découvert les tables, je pensais qu'il y avait un soucis niveau clé, que ça ne pourrait pas marcher.

    mais jusqu'ici, dans les requêtes réalisés, ça n'a jamais causer de problème.

    voici un exemple de requêtes sql que je peux faire sur les deux tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM `fiches_pdt`, `catalogue`
    	WHERE `fiches_pdt`.`ref` = `catalogue`.`prod_ref` AND `prod_id` = 360
    et tout est ok sans problème.

    fin là le truc c'est que ça m'affiche toutes les valeurs où prod_id = 360 alors que moi je veux seulement txt et fin pour prod_id = 360, les autres dépendent de la valeur de la ref qui n'est pas sur la même ligne que prod_id = 360...

    je vais chercher comment tourner ça autrement dans ma requête. si je bloque encore, je reviendrais vers vous.

    merci beaucoup

Discussions similaires

  1. comment faire un insert, + select + update dans la meme requete
    Par jam92400 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 27/06/2006, 18h33
  2. faire rectangle de selection puis cut/paste
    Par linkB2 dans le forum 2D
    Réponses: 4
    Dernier message: 28/04/2006, 12h02
  3. Un double Select doublé d un "for each" qui coince
    Par Sparal dans le forum Access
    Réponses: 4
    Dernier message: 09/02/2006, 14h00
  4. double selection impossible
    Par Ghost Dog dans le forum OpenGL
    Réponses: 3
    Dernier message: 12/05/2005, 19h42

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