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 :

Requête de recherche par tag


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 7
    Points : 8
    Points
    8
    Par défaut Requête de recherche par tag
    Bonsoir à tous:

    Je vous présente mon sujet:
    Je souhaite enregistrer des vidéo en leurs donnant 1 ou plusieurs tags.
    J'ai créer un table video qui contiens les infos des vidéo .
    exemple :
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    id | nom
     1 | supervidéo
     2 | badvidéo

    J'ai lier une table tags qui contient les mots clef et l'id de la vidéo:
    exemple
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    id | video_id | tag
     1 | 1 | super
     2 | 1 | vidéo
     3 | 2 | bad
     4 | 2 | vidéo

    Pour l'instant rien de bien compliqué.
    Je récupère les tags des vidéos et le nombre de vidéo associès avec cette requête :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT COUNT( tag.nom ) AS nb_tag, tag.nom 
    FROM tags tag 
    LEFT JOIN video vid ON tag.video_id = vid.id 
    GROUP BY tag.nom 
    ORDER BY nb_tag DESC

    J'obtiens :
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    nb_tag | nom
    2 | vidéo
    1 | super
    1 | bad


    Pour l'instant aucun soucis.

    Ce que je souhaite faire maintenant c'est associé les tags ensembles c'est à dire:
    Je voudrais ajouter une contrainte à la requête pour quelle affiche les tags des vidéo dont on connait déjà un tag:

    Je souhaite obtenir (pour le tag vidéo) :
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nb_tag | nom
    1 | super
    1 | bad

    Je souhaite obtenir (pour le tag bad) :
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nb_tag | nom
    1 | vidéo

    Je souhaite obtenir (pour le tag super) :
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nb_tag | nom
    1 | vidéo


    Voili, voilà, si j'ai été assé clair et que quelqu'un à une idée je suis preneur.

    Edit : je viens de trouver un lien qui correspond exactement au système de recherche que je souhaite mettre en place (lorsque l'on clique sur le bouton "+" à coté des tags pour les associès) http://www.tagbox.fr/

  2. #2
    Membre habitué
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2007
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2007
    Messages : 112
    Points : 157
    Points
    157
    Par défaut
    OK,

    Alors, je te rassure, je vais te donner une réponse, mais très sincèrement, plusieurs conseils, car ça ne m'étonne que très peu que personne ne t'ai répondu pour les raisons que je vais citer ci-dessous :

    1) La première chose, tu dis que ta table est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    id | video_id | tag
     1 | 1 | super
     2 | 1 | vidéo
     3 | 2 | bad
     4 | 2 | vidéo
    et juste après, on a le droit à :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT COUNT( tag.nom ) AS nb_tag, tag.nom

    ton dernier champs s'appelle t'il tag ou bien nom ?
    Un autre conseil, évite ce qui est renommage des tables quand tu montres ta requête. Si ta table s'appelle tags, n'utilise pas un alias tag dans ta requête, on est perdu ensuite, ou en tout cas, ça demande un effort supplémentaire de lecture.

    Tout ça permettra de gagner du temps pour celui qui veut t'aider. Et comme celui qui t'aidera n'est pas obligé de le faire, il refusera peut être si ça lui prend trop de temps. Alors que toi qui est quémandeur de l'info, à la rigueur, vu que l'aidant te fera gagner du temps, tu peux essayer d'en perdre à lui simplifier la tâche et donc augmenter le nombre de chances qu'il réponde.

    Maintenant, voici la réponse à ton problème, et comme il vaut mieux apprendre à pêcher que fournir le poisson, je vais te montrer la méthode que j'ai utilisé.

    Il faut complexifier les choses au fur et à mesure.

    Tout d'abord, récupérons la liste des vidéos correspondant à ton mot clé :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT video_id
    FROM tags
    WHERE tag = 'bad'

    Ok, jusque là on est good.

    Maintenant, nous voulons la même requête que ce que tu as déjà, mais que pour les vidéos qui correspondent à notre recherche. On va donc rajouter une clause WHERE pour ne sélectionner que les résultats de notre requête précédente :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT COUNT( tags.tag ) AS nb_tag, tags.tag
    FROM tags 
    LEFT JOIN video ON tags.video_id = video.id 
     
    WHERE tags.video_id IN (SELECT video_id FROM tags WHERE tag = 'bad')
     
    GROUP BY tags.tag
     
    ORDER BY nb_tag DESC

    Enfin, nous rajoutons une clause au WHERE pour ne pas avoir le résultat de notre recherche en plus :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT COUNT( tags.tag ) AS nb_tag, tags.tag
    FROM tags 
    LEFT JOIN video ON tags.video_id = video.id 
     
    WHERE tags.video_id IN (SELECT video_id FROM tags WHERE tag = 'bad')
    AND tags.tag != 'bad'
     
    GROUP BY tags.tag
     
    ORDER BY nb_tag DESC

    Voilà, voilà...

Discussions similaires

  1. Moteur de recherche par tags avec table relationelle
    Par Overstone dans le forum Langage SQL
    Réponses: 9
    Dernier message: 16/06/2010, 14h31
  2. Validation algorithme recherche par tags
    Par lvr dans le forum Langage SQL
    Réponses: 6
    Dernier message: 09/05/2010, 00h23
  3. [MySQL] requête de recherche par lettre
    Par lolodelp dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 21/04/2008, 23h15
  4. Recherche par Tag
    Par Oberown dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 28/08/2006, 17h30
  5. Requête sélection : recherche par nom
    Par leeloo77 dans le forum Access
    Réponses: 7
    Dernier message: 17/02/2006, 15h39

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