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

PHP & Base de données Discussion :

besoin d'aide pour jointure à réaliser [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 487
    Par défaut besoin d'aide pour jointure à réaliser
    bonjour a tous,
    je cherche a faire une de table dans ma requete de recherche
    Les données sont les suivantes:

    2 tables automobile et options

    les conditions de recherche sont intégré a un tableaux $where[]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $where = array();
     
    IF ($modele) { // si le champ 1 est renseigné
    $where[] = " modele='$modele' "; // ON l'ajoute a la requete     }
     
    if ($accident) { // si le champ 1 est renseigné
    $where[] = " accident='$accident' "; // on l'ajoute a la requete
    }
    etc................

    la requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $recherche_auto=mysql_query ("SELECT * FROM automobile where marque='$marque' 
    and ".implode("AND",$where))OR die('Erreur MySQL : '.mysql_error());



    la table automobile:
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    CREATE TABLE IF NOT EXISTS `automobile` (
      `id` mediumint(5) NOT NULL AUTO_INCREMENT,
      `id_membre` mediumint(5) NOT NULL,
      `marque` varchar(2) collate latin1_general_ci NOT NULL,
      `modele` varchar(3) collate latin1_general_ci NOT NULL,
      `mois` varchar(2) collate latin1_general_ci NOT NULL,
      `annee` varchar(4) collate latin1_general_ci NOT NULL,
      `prix` varchar(5) collate latin1_general_ci NOT NULL,
      `accident` varchar(1) collate latin1_general_ci NOT NULL,
      `carburant` varchar(1) collate latin1_general_ci NOT NULL,
      `kilometrage` varchar(5) collate latin1_general_ci NOT NULL,
      `chevaux` varchar(2) collate latin1_general_ci NOT NULL,
      `vehicule_etat` varchar(1) collate latin1_general_ci NOT NULL,
      `transmission` varchar(1) collate latin1_general_ci NOT NULL,
      `cylindre` varchar(1) collate latin1_general_ci NOT NULL,
      `couleur_inter` varchar(1) collate latin1_general_ci NOT NULL,
      `type_carro` varchar(1) collate latin1_general_ci NOT NULL,
      `couleur_carro` varchar(1) collate latin1_general_ci NOT NULL,
      `pays` varchar(1) collate latin1_general_ci NOT NULL,
      `cp` varchar(5) collate latin1_general_ci NOT NULL,
      `description` varchar(200) collate latin1_general_ci NOT NULL,
      `site` varchar(100) collate latin1_general_ci NOT NULL,
      `date` varchar(11) collate latin1_general_ci NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=3 ;
     
    --
    -- Contenu de la table `automobile`
    --
     
    INSERT INTO `automobile` (`id`, `id_membre`, `marque`, `modele`, `mois`, `annee`, `prix`, `accident`, `carburant`, `kilometrage`, `chevaux`, `vehicule_etat`, `transmission`, `cylindre`, `couleur_inter`, `type_carro`, `couleur_carro`, `pays`, `cp`, `description`, `site`, `date`) VALUES
    (1, 1, '69', '976', '7', '1990', '1000', '2', '3', '10000', '12', '1', '1', '1', '2', '2', '5', '1', '75', 'super 190', 'http://www.nebilpro.free.fr', '1215880255'),
    (2, 1, '69', '993', '1', '2007', '1000', '2', '2', '10000', '1', '1', '1', '9', '1', '7', '2', '1', '93', 'ignez-vous aux millions d''utilisateurs qui ont déjà intégré la famille eBay. Ce sera un plaisir de vous accueillir parmi nous.\r\n\r\nInscrivez-vous sur eBay pour pouvoir bénéficier des différents avantag', 'http://', '1215881645');


    la table options


    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    CREATE TABLE IF NOT EXISTS `options` (
      `id` mediumint(5) NOT NULL AUTO_INCREMENT,
      `id_auto` varchar(2) collate latin1_general_ci NOT NULL,
      `option` varchar(5) collate latin1_general_ci NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=32 ;
     
    --
    -- Contenu de la table `options`
    --
     
    INSERT INTO `options` (`id`, `id_auto`, `option`) VALUES
    (1, '1', '6'),
    (2, '1', '15'),
    (3, '1', '18'),
    (4, '1', '21'),
    (5, '1', '24'),
    (6, '1', '28'),
    (7, '1', '31'),
    (8, '1', '35'),
    (9, '1', '37'),
    (10, '1', '38'),
    (11, '1', '39'),
    (12, '1', '40'),
    (13, '1', '42'),
    (14, '1', '43'),
    (15, '2', '8'),
    (16, '2', '11'),
    (17, '2', '15'),
    (18, '2', '16'),
    (19, '2', '17'),
    (20, '2', '18'),
    (21, '2', '24'),
    (22, '2', '25'),
    (23, '2', '29'),
    (24, '2', '30'),
    (25, '2', '33'),
    (26, '2', '37'),
    (27, '2', '38'),
    (28, '2', '39'),
    (29, '2', '40'),
    (30, '2', '42'),
    (31, '2', '44');

    le probleme:[/I]

    donc une partis des carateristiques de l'auto etant sur la table automobile , la pas de probelme , mais l'autre partie se trouvent sur la table option donc mon soucis c'est
    1/ faire la jointure dans la requete
    2/ inclure les conditions de recherche qui se trouvent sur la table options
    dans la requete.

    merci d'avance pour votre aide .

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Tu ne peux pas ressortir une ligne par vehicule par une jointure puisque tu as une relation 1-plusieurs entre les deux tables.

    Attention egalement "option" est un mot reservé par mysql, et ton champ "option" est un VARCHAR alors qu'il est visiblement de type entier.

    Tu peux construire une requete comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select * from automobile 
    WHERE marque='GKLJ' 
    AND accident=7 
    AND id in (select id_auto from options WHERE option_id IN (15,7,8))
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 487
    Par défaut
    merci sabotage de ta reponse
    si tu me permet je demande quelque eclaircissement
    selectionne toute les lignes d'automobile ou marque=GKLJ et accident=7
    et l'id dans ( selectionne id-auto chez options ou option-id contient 15/7/8 .

    la recherche d'option dans la table OPTIONS se fait-elle par rapport a la marque ? a quel endroit de la requete cela ce fait?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select * from automobile 
    WHERE marque='GKLJ' 
    AND accident='7' 
    AND id in (select id_auto from options WHERE option_id IN (15,7,8))


    sinon j'ai sa en retour quand le la test de cette maniere
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * from automobile 
    WHERE marque='993' 
    AND id in (select id_auto from options WHERE option IN (38,40))
    requête SQL: Documentation

    SELECT *
    FROM automobile
    WHERE marque = '993'
    AND id
    IN (

    SELECT id_auto
    FROM options
    WHERE OPTION IN ( 38, 40 )
    )
    LIMIT 0 , 30

    MySQL a répondu : Documentation
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'option IN ( 38 , 40 ) )
    LIMIT 0, 30' at line 1

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    select id_auto from options WHERE option_id IN (15,7,8)
    <=>
    on selectionne tous les id_auto qui ont une option_id de 15, 7 ou 8

    Donc dans la requete complete, on selectionne les vehicules qui ont une marque donnée ET dont l'id existe dans la base "options" avec l'option 15, 7 ou 8


    Pour l'erreur, comme je te l'ai dis "option" est un mot reservé par mysql, il faut que tu renommes ton champ, ou vraiment au pire que tu le mettes entre guillemets dans la requete.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 487
    Par défaut
    Citation Envoyé par sabotage Voir le message
    select id_auto from options WHERE option_id IN (15,7,8)
    <=>
    on selectionne tous les id_auto qui ont une option_id de 15, 7 ou 8
    Ok dans ma recherche de fonctionnement il me faut remplacer ton ou en et ce qui donne
    on selectionne tous les id_auto qui ont une option_id de 15, 7,55,88,22 et 8 ( conditions obligatoire )
    que faut-il changer pour la faire tourner avec le et ?

    quand a ces meme conditions d'option elle doivent etre ajouter au tableaux $where[] des conditions qui sont dans la table automobile ou doit-je crée un nouveaux tableaux que je devrais implodé de la meme maniere que celui des conditions de la table automobile ?
    Merci

    se devrais ressemblais a quelque chose comme ca et si oui comment remplacer (38,40 etc...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $recherche_auto=mysql_query ("select * from automobile WHERE marque='$marque' 
    and .implode("AND",$where) AND id in (select id_auto from options 
    WHERE option_auto IN (38,40))

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Je pense effectivement qu'il faut un deuxieme tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    foreach ($option as $value) {
    // on construit la liste du IN
    $liste_option .= $value . ',';
    }
    // on retire la derniere virgule
    $liste_option = substr($$liste_option,0, -1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT id_auto from options WHERE option_id IN (' . $liste_option . ') 
    HAVING count(id_auto) = ' . $count($option)
    On selectionne tous les vehicules qui ont une option faisant partie de la liste mais qui ont egalement le nombre d'options demandés... en francais cela donne : les vehicules qui ont toutes les options demandés.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

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

Discussions similaires

  1. Besoin d'Aide pour Jointure Externe
    Par Quintoux dans le forum SQL
    Réponses: 2
    Dernier message: 27/04/2012, 13h38
  2. Besoin d'aide pour la réalisation d'un projet
    Par boubou2007 dans le forum ALM
    Réponses: 2
    Dernier message: 01/02/2011, 12h16
  3. besoin d'aide pour une jointure avec une exclusion
    Par manu_71 dans le forum Requêtes
    Réponses: 2
    Dernier message: 27/02/2007, 11h22
  4. Besoin d'aide pour des jointures de tables
    Par supersmoos dans le forum Requêtes
    Réponses: 4
    Dernier message: 14/12/2006, 15h38

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