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 PHP Discussion :

Ecrire une clause en fonction des choix dans le moteur de recherche


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Webmaster
    Inscrit en
    Avril 2014
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2014
    Messages : 61
    Par défaut Ecrire une clause en fonction des choix dans le moteur de recherche
    Bonsoir,

    Pouvez vous m'aider svp ?

    Voilà je cherche la bonne façon de faire pour écrire ma requête.

    Actuellement j'ai 1 table "abonnes" et une table "abonnements" (liées entre elles)

    Code sql : 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
    --
    -- Structure de la table `abonnes`
    --
     
    CREATE TABLE IF NOT EXISTS `abonnes` (
      `id_abonne` int(11) NOT NULL AUTO_INCREMENT,
      `nom_abonne` varchar(32) NOT NULL,
      `age_abonne` date NOT NULL,
      `sexe_abonne` varchar(1) NOT NULL,
      PRIMARY KEY (`id_abonne`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
     
    --
    -- Contenu de la table `abonnes`
    --
     
    INSERT INTO `abonnes` (`id_abonne`, `nom_abonne`, `age_abonne`, `sexe_abonne`) VALUES
    (1, 'pierre', '1978-05-06', 'H'),
    (2, 'marie', '1988-02-09', 'F');
     
    --
    -- Structure de la table `abonnements`
    --
     
    CREATE TABLE IF NOT EXISTS `abonnements` (
      `id_abonnement` int(11) NOT NULL AUTO_INCREMENT,
      `nom_abonnement` varchar(255) NOT NULL,
      `abonne_abonnement` int(11) NOT NULL,
      PRIMARY KEY (`id_abonnement`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
     
    --
    -- Contenu de la table `abonnements`
    --
     
    INSERT INTO `abonnements` (`id_abonnement`, `nom_abonnement`, `abonne_abonnement`) VALUES
    (1, 'le monde', 1),
    (2, 'l''equipe', 1),
    (3, 'marie claire', 1),
    (4, 'figaro', 2),
    (5, 'lui', 1),
    (6, 'elle', 2);

    pour afficher tous mes abonnements et les abonnes correspondants j'ai fait ceci (ça affiche tout)

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM `abonnements` LEFT OUTER JOIN abonnes on id_abonne = abonne_abonnement

    Ca vous parait juste ? C'est quoi la différence avec le right outer join ?

    Mon vrai problème est que je ne sais pas comment écrire et intégrer ma clause where avec mon moteur de recherche.

    Si je sélectionne que les abonnes homme "H" ou que les abonnes femme "F" je ne sais pas comment ça se traduit dans ma requête.

    Même chose si on me demande de sélectionner les abonnes femme ou homme qui ont tel age (en fonction de la date de naissance)

    Merci de m'avoir lue et encore plus si vous pouvez m'aider

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Avant de construire ton modèle, tu dois te poser ces deux questions (entre autres):
    1. Peut-il y avoir un abonné sans abonnement (un ancien abonné par exemple, ou un futur abonné mais qui n'est pas encore décidé, un abonné dont le journal n'existe plus)?
    2. Peut-il y avoir un journal sans abonnés?


    Si la réponse est non pour ces deux questions (et que c'est bien le cas dans tes tables), dans ce cas que la jointure soit à gauche, à droite, interne ou externe, tu obtiendras le même résultat.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT abonnements.nom_abonnement AS journal, abonnes.nom_abonne AS nom
    FROM abonnements
    LEFT INNER JOIN abonnes
    ON abonnes.id_abonne = abonnements.abonne_abonnement
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT abonnements.nom_abonnement AS journal, abonnes.nom_abonne AS nom
    FROM abonnements
    LEFT OUTER JOIN abonnes
    ON abonnes.id_abonne = abonnements.abonne_abonnement
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT abonnements.nom_abonnement AS journal, abonnes.nom_abonne AS nom
    FROM abonnements
    RIGHT OUTER JOIN abonnes
    ON abonnes.id_abonne = abonnements.abonne_abonnement

    produiront alors le même résultat (avec une variation de l'ordre pour la dernière requête):
    journal nom
    le monde pierre
    l'equipe pierre
    marie claire pierre
    lui pierre
    figaro marie
    elle marie


    Si par contre tu autorises un "abonné" à n'être abonné à rien du tout (ce qui est possible avec tes tables), disons "Paul", dans ce cas il n'apparaîtra pas avec une jointure interne mais va apparaître avec une jointure externe du coté de la table "abonnes" (OUTER inclus les éléments en dehors de la liaison, LEFT se rapporte à la table après l'instruction FROM, RIGHT à celle après JOIN), soit:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT abonnements.nom_abonnement AS journal, abonnes.nom_abonne AS nom
    FROM abonnements
    RIGHT OUTER JOIN abonnes
    ON abonnes.id_abonne = abonnements.abonne_abonnement
    ou en plaçant la table "abonnes" à gauche:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT abonnements.nom_abonnement AS journal, abonnes.nom_abonne AS nom
    FROM abonnes
    LEFT OUTER JOIN abonnements
    ON abonnes.id_abonne = abonnements.abonne_abonnement

    qui donneront:
    journal nom
    le monde pierre
    l'equipe pierre
    marie claire pierre
    lui pierre
    figaro marie
    elle marie
    NULL paul



    Sinon ton modèle n'est pas idéal, car il va engendrer beaucoup de redondances. Imagine si tu as x abonnés au journal "Le Monde", alors ta table "abonnements" contiendra x fois la chaîne "le monde". Pour pallier à ce problème, il faut faire un modèle à trois tables: la table "abonne", la table "journal", la table "abonnement". La table "journal" ne devra contenir que le nom du journal et son id. La table "abonnement" contiendra juste deux clés étrangères: id_abonne, id_journal.

    Je te conseille de te plonger dans les tutoriels du site.

  3. #3
    Membre confirmé
    Femme Profil pro
    Webmaster
    Inscrit en
    Avril 2014
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2014
    Messages : 61
    Par défaut
    C'est super, merci beaucoup CosmoKnacki !!!

    L'idée était de dire : un abonnement a forcement un abonné.

    J'aurai pu gérer cela avec une table tierce, tu as raison.

    Par contre est-ce que tu sais comment écrire la requête de select avec une clause on va dire dynamique (c'est à dire quand on rajoute un critère dans le moteur de recherche)

    Par défaut j'ai ma requête (d'ailleurs pourquoi les alias AS ? On les réutilise où/pas ?)

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT abonnements.nom_abonnement AS journal, abonnes.nom_abonne AS nom
    FROM abonnements
    LEFT INNER JOIN abonnes
    ON abonnes.id_abonne = abonnements.abonne_abonnement

    Imaginons que je sélectionne le critère "sexe" (donc "H" ou "F")

    Comment dois/puis-je intégrer cette clause WHERE abonnes.sexe_abonne = "H" à la volée ? C'est vraiment la syntaxe exacte qui me manque.

    Merci à toi.

    M_M

  4. #4
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    L'idée était de dire : un abonnement a forcement un abonné.
    Oui, ça ce voit à la clause NOT NULL de la colonne "abonnements.abonne_abonnement", mais avec une telle structure, rien n'empêche un enregistrement dans la table "abonnements" de se référer à un abonné qui n'existe pas. Tu devrais te pencher sur les contraintes d'intégrité.

    J'aurai pu gérer cela avec une table tierce, tu as raison.
    Tu le peux encore.

    Comment dois/puis-je intégrer cette clause WHERE abonnes.sexe_abonne = "H"
    Ajoute la à la fin de ta requête, je ne vois pas trop quel est le problème. Au passage, la colonne sexe tu peux la passer en CHAR au lieu de VARCHAR(1).

    d'ailleurs pourquoi les alias AS ? On les réutilise où/pas ?
    Tu en fais ce que tu veux, ils ne sont pas essentiels. Leurs buts sont de clarifier, simplifier une requête ou de faciliter l'accès aux résultats.

    NB: Si tu veux tester tes requêtes ou essayer de nouveaux modèles, je te conseille d'utiliser MySQL Workbench (gratuit), c'est mieux que de se galérer avec PHPMyAdmin.

  5. #5
    Membre confirmé
    Femme Profil pro
    Webmaster
    Inscrit en
    Avril 2014
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2014
    Messages : 61
    Par défaut
    Merci

    En fait ma requête évolue en fonction des choix dans le moteur de recherche.

    Par défaut c'est cette requête qui est jouée :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT abonnements.nom_abonnement AS journal, abonnes.nom_abonne AS nom
    FROM abonnements
    LEFT INNER JOIN abonnes
    ON abonnes.id_abonne = abonnements.abonne_abonnement

    mais si je trie les hommes et les femmes que dois-je écrire pour lui dire que ce critère existe ou a été demandée.

    Dans l'absolu ca va donner
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT abonnements.nom_abonnement AS journal, abonnes.nom_abonne AS nom
    FROM abonnements
    LEFT INNER JOIN abonnes
    ON abonnes.id_abonne = abonnements.abonne_abonnement
    WHERE abonnes.sexe_abonne = "H"
    mais il me manque le truc pour dire que je dois écrire un where c'est quoi la façon de dire : si le filtre genre existe et s'il est = à "H" ou "F"

    Comment on l'écrit proprement à la volée si je puis dire ? Comment je passe de la première requête à la seconde de façon automatique ?

    M_M

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Non mais je vois vraiement pas ce qu'il y a de compliqué dans ton histoire. Rassure moi, tu as bien créé un formulaire permettant de saisir la demande de l'utilisateur? Si oui, il suffit de tester les valeurs renvoyées par ce formulaire dans un script php pour construire la requête et puis c'est tout. Si non, qu'est ce que tu attends pour le faire?

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/01/2011, 09h34
  2. Réponses: 11
    Dernier message: 10/06/2008, 10h31
  3. Réponses: 5
    Dernier message: 08/05/2008, 21h44
  4. Variable qui évolue en fonction des choix dans formulaire
    Par stefou007 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/09/2005, 22h40

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