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 :

ordonner un résultat suivant le nombre des mots-clés trouvés


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 231
    Points : 73
    Points
    73
    Par défaut ordonner un résultat suivant le nombre des mots-clés trouvés
    Bonjour, voilà ma requete:

    select * from artiste where NOM_ARTISTE like "%artiste1%" OR NOM_ARTISTE like "%sur%" OR NOM_ARTISTE like "%la%" OR NOM_ARTISTE like "%lune%"

    je veux afficher les données concernant un artiste lorsque son nom NOM_ARTISTE contient l'un des quatres mots-clés

    Mais je veux ordonner l'affichage comme suit:
    -on affiche en premier les artistes ayant pour noms des noms qui contiennent tous les mots-clés(4)
    -ensuite les noms avec 3 mots-clés
    -ensuite les noms avec 2 mots-clés
    -en dernier les noms qui ne contiennent qu'un seul mot-clé

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    En supposant que le Nom_Artiste soit unique (sinon, il faut remplacer Nom_Artiste par la clé de la table Artiste, patout sauf dans les LIKE), tu peux essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT a.* 
    FROM Artiste a INNER JOIN (SELECT Nom_Artiste, COUNT(*) AS Pertinence
                               FROM (SELECT Nom_Artiste FROM Artiste WHERE Nom_Artiste LIKE '%artiste1%'
                                    UNION ALL
                                     SELECT Nom_Artiste FROM Artiste WHERE Nom_Artiste LIKE '%sur%'
                                    UNION ALL
                                     SELECT Nom_Artiste FROM Artiste WHERE Nom_Artiste LIKE '%la%'
                                    UNION ALL
                                     SELECT Nom_Artiste FROM Artiste WHERE Nom_Artiste LIKE '%lune%')
                               GROUP BY Nom_Artiste) b
                   ON a.Nom_Artiste = b.Nom_Artiste
    ORDER BY Pertinence DESC
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 231
    Points : 73
    Points
    73
    Par défaut
    j'ai essayé ton code Médiat mais il y a une erreur

    et en plus je veux eviter les redoublements de résultats, c'est-à-dire je ne veux pas que l'artiste ayant comme nom un nom contenant tous les mots-clés s'affiche une deuxième fois dans le nom avec 3 mots-clés et une troisième fois

  4. #4
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 231
    Points : 73
    Points
    73
    Par défaut
    Voici l'erreur :
    Erreur de syntaxe près de 'SELECT NOM_ARTISTE, COUNT( NOM_ARTISTE ) AS Pertinence
    FROM ([/quote]

    et nom_artiste n'est pas la clé unique mais id_artiste

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 231
    Points : 73
    Points
    73
    Par défaut
    Voici ma requete qui affiche le résultat mais pas ordonnée

    SELECT ID_ARTISTE, NOM_ARTISTE FROM artiste WHERE NOM_ARTISTE LIKE '%art%' UNION SELECT *
    FROM artiste WHERE NOM_ARTISTE LIKE '%a%' UNION SELECT * FROM artiste WHERE NOM_ARTISTE LIKE '%3%' UNION SELECT * FROM artiste WHERE NOM_ARTISTE LIKE '%b%'

    mon problème maintenant est de les ordonner suivant les nombres de mots-clés existant dans NOM_ARTISTE

  6. #6
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Avec Id_Artiste comme clé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT a.* 
    FROM Artiste a INNER JOIN (SELECT Id_Artiste, COUNT(*) AS Pertinence
                               FROM (SELECT Id_Artiste FROM Artiste WHERE Nom_Artiste LIKE '%artiste1%'
                                    UNION ALL
                                     SELECT Id_Artiste FROM Artiste WHERE Nom_Artiste LIKE '%sur%'
                                    UNION ALL
                                     SELECT Id_Artiste FROM Artiste WHERE Nom_Artiste LIKE '%la%'
                                    UNION ALL
                                     SELECT Id_Artiste FROM Artiste WHERE Nom_Artiste LIKE '%lune%')
                               GROUP BY Id_Artiste) b
                   ON a.Id_Artiste = b.Id_Artiste
    ORDER BY Pertinence DESC
    Je viens de faire le test sous ORACLE 9i, je n'ai pas d'erreur ni de répétition d'artiste (même avec deux artistes portant le même nom) :

    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
    CREATE TABLE dvp_artiste (Id_Artiste INTEGER, nom_artiste VARCHAR(100));
    INSERT INTO dvp_artiste VALUES (1, 'beau comme la lune');
    INSERT INTO dvp_artiste VALUES (2, 'beau la lune');
    INSERT INTO dvp_artiste VALUES (3, 'beau comme');
    INSERT INTO dvp_artiste VALUES (4, 'beau comme la lune');
    INSERT INTO dvp_artiste VALUES (5, 'la lune est belle');
    INSERT INTO dvp_artiste VALUES (6, 'Bonjour Marcel');
    SELECT * FROM dvp_artiste;
     
    SELECT a.*, pertinence 
    FROM dvp_artiste a INNER JOIN (SELECT Id_Artiste, COUNT(*) AS Pertinence 
                                   FROM (SELECT Id_Artiste FROM dvp_artiste WHERE Nom_Artiste LIKE '%beau%' 
                                        UNION ALL 
                                         SELECT Id_Artiste FROM dvp_artiste WHERE Nom_Artiste LIKE '%comme%' 
                                        UNION ALL 
                                         SELECT Id_Artiste FROM dvp_artiste WHERE Nom_Artiste LIKE '%la%' 
                                        UNION ALL 
                                         SELECT Id_Artiste FROM dvp_artiste WHERE Nom_Artiste LIKE '%lune%') 
                                   GROUP BY Id_Artiste) b 
                       ON a.Id_Artiste = b.Id_Artiste 
    ORDER BY Pertinence DESC
    Réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1	beau comme la lune  4
    4	beau comme la lune  4
    2	beau la lune        3
    3	beau comme          2
    5	la lune est belle   2
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  7. #7
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 231
    Points : 73
    Points
    73
    Par défaut
    j'utilise Mysql et il y a bien une erreur qui s'affiche; voici l'erreur

    "#1064 - Erreur de syntaxe près de 'SELECT ID_ARTISTE, COUNT( * ) AS Pertinence
    FROM (
    SELECT ID' à la ligne 4"

  8. #8
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    D'où l'utilité des règles de ce forum : indiquer son SGBDR, et sa version !
    mySQL n'accepte les sous-requêtes qu'à partir de la version 4.1
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  9. #9
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 231
    Points : 73
    Points
    73
    Par défaut
    ah d'accord, puisque moi j'utilise EasyPhp1.7 et donc Mysql 4.0.15.

    Milles excuses

  10. #10
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 231
    Points : 73
    Points
    73
    Par défaut
    sinon est-ce que tu peux me montrer une reponse en Mysql 4.0.15

  11. #11
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    utilise les champs full text, t'a un resultat selon la pertinence, exprimée de 0 a 100, si mes souvenirs sont bons

    la syntaxe est sur le site

  12. #12
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 231
    Points : 73
    Points
    73
    Par défaut
    j'ai essayé avec fulltext:

    voici ma table artiste
    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
     
    CREATE TABLE `artiste` (
      `ID_ARTISTE` int(11) NOT NULL auto_increment,
      `NOM_ARTISTE` text NOT NULL,
      `PHOTO` varchar(100) default NULL,
      PRIMARY KEY  (`ID_ARTISTE`),
      FULLTEXT KEY `NOM_ARTISTE` (`NOM_ARTISTE`)
    ) TYPE=MyISAM AUTO_INCREMENT=8 ;
     
    #
    # Contenu de la table `artiste`
    #
     
    INSERT INTO `artiste` VALUES (1, 'artiste1', NULL);
    INSERT INTO `artiste` VALUES (2, 'artiste2 b', NULL);
    INSERT INTO `artiste` VALUES (3, 'artiste3', NULL);
    INSERT INTO `artiste` VALUES (4, 'artiste3 beta', NULL);
    INSERT INTO `artiste` VALUES (6, 'rossy', '2.jpg');
    INSERT INTO `artiste` VALUES (7, 'rossy', '16.jpg');
    et voilà ma requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT ID_ARTISTE,NOM_ARTISTE,MATCH(NOM_ARTISTE) AGAINST ('rossy') AS NOM FROM artiste ORDER BY NOM DESC
    ca marche mais je ne veux pas afficher les résultats qui ne contienne aucune des mots-clés[/img]

  13. #13
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 231
    Points : 73
    Points
    73
    Par défaut
    c'est-à-dire voilà le resultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    6	rossy  	0.68526663197496
    7	rossy 	0.68526663197496
    1	artiste1 	0
    2	artiste2 b 	0
    3	artiste3 	0
    4	artiste3 beta 	0
    alors que je veux simplement les deux rossy en haut.

    J'ai essayé d'inserer une clause WHERE NOM NOT NULL mais il me dit une erreur

  14. #14
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    met un WHERE MATCH...

Discussions similaires

  1. Compter le nombre des mots
    Par messi1987 dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 29/11/2014, 15h11
  2. un programme qui calcule le nombre des mots
    Par komat dans le forum Débuter
    Réponses: 3
    Dernier message: 06/12/2010, 22h46
  3. Réponses: 3
    Dernier message: 28/03/2008, 14h48
  4. Comment stocker des mots clés dans une bas Mysql
    Par renofx1 dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 05/01/2006, 00h57
  5. Liste des mots clés c++
    Par CyberCouf dans le forum C++
    Réponses: 4
    Dernier message: 08/12/2005, 00h13

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