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

SQL Firebird Discussion :

[GROUP BY/JOIN] Utilisation mots clés


Sujet :

SQL Firebird

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Par défaut [GROUP BY/JOIN] Utilisation mots clés
    Bonsoir à tous,

    Cela fait 2h que je bosse sur une requête qui, en MySQL, me poserait sûrement moins de problèmes. Mais bon voilà, le client a un serveur sous Firebird donc pas trop le choix !

    J'ai 2 tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Documents (ID,TITRE,....)
    MotsCles(IDDOCUMENT,MOT)
    Mon but, c'est de sortir tous les documents (table Documents) répondant aux mots clés (table MotsCles) saisis par l'utilisateur.

    Si l'utilisateur saisi "coussin" et "lit", il aura les documents qui ont comme mot clé "coussin" ET "lit" (les deux).

    J'ai essayé bon nombre de requêtes mais firebird semble fonctionner différemment au niveau des "group by", car j'ai souvent le message d'erreur suivant :

    -SQL error code = -104
    -Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)
    Pour le moment, voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ID,TITRE,AUTEUR 
    FROM DOCUMENTS 
    LEFT JOIN MOTSCLES ON DOCUMENTS.ID=MOTSCLES.IDDOCUMENT 
    WHERE UPPER(MOT) LIKE UPPER('%lit%')
    AND UPPER(MOT) LIKE UPPER('%coussin%')
    La requête ne me renvoi rien du tout... Et si je mets juste "lit", j'ai souvent des occurrences en double.


    Je peine un peu... Alors si une âme charitable passe par là... Dans le cas contraire j'espère y voir un peu plus clair demain.

    La nuit porte conseil...

    Merci

  2. #2
    Membre Expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Par défaut
    Firebird respecte la norme SQL

    dans ces cas là donne nous :
    - la définition des tables (create table ..)
    - un jeu d'essai : insert into ...
    pour que l'on y voit clair et que l'on puisse t'aider
    et éventuellement la requete telle que tu l'écrivais avec MySQL

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 593
    Billets dans le blog
    65
    Par défaut
    La requête me semble correcte , j'en ai fait une quasiment identique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select i.CHANTIER,d.num_intervention,d.REF from INTERVENTIONS i join DETAIL_INTERVENTION d
    on d.NUM_INTERVENTION=i.NUM_UNIQUE
    where UPPER(d.REF) containing upper('ref')
    or UPPER(d.REF) containing upper('kil')
    a quelques détails près
    je préfère utiliser des alias aux tables , containing plutôt que like '%..%'
    et être très explicite sur les données (d.REF au lieu de REF)

    après un gros dodo peut-être que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT D.ID,D.TITRE,D.AUTEUR 
    FROM DOCUMENTS D
    LEFT JOIN MOTSCLES M ON D.ID=M.IDDOCUMENT 
    WHERE UPPER(M.MOT) LIKE UPPER('%lit%')
    AND UPPER(M.MOT) LIKE UPPER('%coussin%')
    fonctionnera

  4. #4
    Membre confirmé Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Par défaut
    Hello,

    Merci déjà pour vos réponses.

    SergioMaster, je ne connaissais pas "CONTAINING" qui est bien plus pratique car évitant l'utilisation des %, merci

    Malheureusement, même avec les Alias, le résultat n'est pas plus causant...

    Makowski, voilà la définition de mes tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE DOCUMENTS (
       ID INT NOT NULL,
       TITRE VARCHAR(155),
       ...
       PRIMARY KEY (ID));
     
    CREATE TABLE MOTSCLES (
       IDDOCUMENT NOT NULL,
       MOT VARCHAR(155) NOT NULL,
       PRIMARY KEY (IDDOCUMENT,MOT));
    Il y a un générateur sur Documents, avec un trigger qui incrémente automatiquement l'ID.

    Et voici quelques insertions basiques :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INSERT INTO DOCUMENTS VALUES (1,'Il était une fois',...);
    INSERT INTO MOTSCLES VALUES (1,'Fée');
    INSERT INTO MOTSCLES VALUES (1,'Chevalier');
    INSERT INTO MOTSCLES VALUES (1,'Princesse');
    INSERT INTO DOCUMENTS VALUES (2,'Le jardin pour les nuls',...);
    INSERT INTO MOTSCLES VALUES (2,'Jardin');
    INSERT INTO MOTSCLES VALUES (2,'Jardiner');
    INSERT INTO MOTSCLES VALUES (2,'Plantes');
    Si j'utilise ma requête avec les mots clés "Jardin" et "Plantes", je devrais avoir le document n°2, et pourtant je n'ai aucun résultat...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT D.ID,D.TITRE,D.AUTEUR,D."PAGES",M.MOT 
    FROM DOCUMENTS D
    JOIN MOTSCLES M ON D.ID=M.IDDOCUMENT 
    WHERE UPPER(M.MOT) CONTAINING UPPER('Jardin')
    AND UPPER(M.MOT) CONTAINING UPPER('Plantes')
    Je ne sais pas en revanche ce que j'aurais utilisé sur MySQL. Je parlais juste des requêtes d'une manière générale

    Je vais continuer à chercher. Il me reste que 2 jours ça va

  5. #5
    Membre Expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Par défaut
    D'abort quelle version de Firebird ?
    Quel jeu de caractère et quel ordre de tri pour tes champs ?
    quelle idée de faire des UPPER de partout ...

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 593
    Billets dans le blog
    65
    Par défaut
    Si j'utilise ma requête avec les mots clés "Jardin" et "Plantes", je devrais avoir le document n°2, et pourtant je n'ai aucun résultat...
    normal , d'après le jeu d'essai
    un OR par contre ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT D.ID,D.TITRE,M.MOT 
    FROM DOCUMENTS D LEFT
    JOIN MOTSCLES M ON D.ID=M.IDDOCUMENT 
    WHERE UPPER(M.MOT) CONTAINING UPPER('Jardin')
    OR UPPER(M.MOT) CONTAINING UPPER('Plantes')
    Citation Envoyé par resultat
    2 Le jardin pour les nuls Jardin
    2 Le jardin pour les nuls Jardiner
    2 Le jardin pour les nuls Plantes

  7. #7
    Membre confirmé Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Par défaut
    Citation Envoyé par makowski Voir le message
    D'abort quelle version de Firebird ?
    Quel jeu de caractère et quel ordre de tri pour tes champs ?
    quelle idée de faire des UPPER de partout ...
    Je suis sous la version 2.1. Jeu de caractère par défaut et aucun ordre de tri pour le moment.

    Ensuite pour les UPPER c'est un peu obligé si je ne veux pas que la recherche soit sensible à la case, à moins que tu ai une autre solution : je suis toujours preneur.

    Citation Envoyé par SergioMaster Voir le message
    normal , d'après le jeu d'essai
    un OR par contre ...
    Oui ça me semble normal aussi mais là je sèche un peu... Et si je mets un OR, il ne me retourne pas les enregistrements répondant à tous les critères, mais que ceux répondant à au moins 1 des critères...

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

Discussions similaires

  1. Mots clés utilisables dans tous les SGBD et norme SQL ?
    Par BIOoOAG dans le forum Langage SQL
    Réponses: 16
    Dernier message: 31/10/2014, 11h56
  2. Réponses: 17
    Dernier message: 03/08/2013, 12h29
  3. Réponses: 4
    Dernier message: 11/01/2010, 11h04
  4. Réponses: 2
    Dernier message: 22/11/2006, 12h09

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