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

Requêtes MySQL Discussion :

requête AND sur un même champ


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 11
    Points : 8
    Points
    8
    Par défaut requête AND sur un même champ
    Bonjour,

    Je possède une table :
    Field Type
    keyword int(10) unsigned
    file mediumint(8) unsigned
    score float

    Je voudrais effectuer une requête qui me renvoie tous les `file` qui contienne les `keyword`.
    Actuellement, j'ai réussi à faire la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT *
    FROM `moteur_key_word`
    WHERE
         (`keyword` =10
         OR `keyword` =100
         )
    GROUP BY `fichier`
    LIMIT 0 , 30
    Le problème est que la requête effectue un OR avec les mots recherchés et non pas un AND. et bien sûr, si je remplace le OR par un AND, il n'y a aucun résultat (logique).

    J'ai ensuite essayé de faire une requête "bourrin" :
    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
    SELECT *
    FROM (
         SELECT *
         FROM `moteur_key_word`
         WHERE (
              `keyword` =10
              )
         )a
    JOIN (
         SELECT *
         FROM `moteur_key_word`
         WHERE (
              `keyword` =100
              )
         )b
    GROUP BY `file`
    Seulement il me renvoie
    #1052 - Column 'file' in group statement is ambiguous
    Logique puisque le JOIN crée 2 champs avec comme nom file. En plus, en regardant les résultats, la requête m'a l'air pas vraiment au point...

    Bref, si quelqu'un a une idée, elle est la bienvenue.

    Le top du top, ce serait qu'en faisant le GROUP BY, il additionne le score d'un même fichier.

    Voilà, vous savez tout. Merci d'avoir lu mon post et mon WE.

    PS : il s'agit effectivement d'un moteur de recherche.

  2. #2
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    keyword int(10) unsigned
    file mediumint(8) unsigned
    score float

    Je voudrais effectuer une requête qui me renvoie tous les `file` qui contienne les `keyword`.
    Bizarre cette notion de 'contenir' avec des entiers !

    Peux-tu préciser avec un exemple ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    En fait, l'utilisateur saisit les mots clefs. Ensuite, une table convertie les mots clefs en nombre en renvoyant -1 si le mot n'est pas référencé (c'est plus simple de recherche dans une base de données avec des nombres).
    Ensuite, j'ai une grosse base de données qui contient un enregistrement par fichier et par mot différent et un score "calculé" en fonction du nombre de fois qu'apparaît chaque mot dans chaque fichier et de sa position.

    ce qui me donne par exemple
    file keyword score
    1 1 0.1
    1 2 0.2
    1 3 0.3
    2 2 0.4
    2 3 0.5
    2 4 0.6
    3 1 0.7
    3 3 0.8
    3 4 0.9

    Si l'utilisateur tape 2 mots qui correspondent (après conversion du texte en nombre) à 1 et 3, il faudrait que la requête me renvoie (en triant par score bien sûr) :
    3 1.5
    1 0.4

    la première colonne contient le fichier qui possède les mots 1 et 3 et la deuxième colonne contient la somme des scores.

  4. #4
    Membre régulier
    Homme Profil pro
    Médecin.
    Inscrit en
    Septembre 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Médecin.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2008
    Messages : 96
    Points : 94
    Points
    94
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT file, sum(keyword) 
    FROM `moteur_key_word`
    WHERE
         (`keyword` =1
         OR `keyword` =3
         )
    GROUP BY `file`
    order by 2 desc
    Est ce que ça répond à ta question ?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Ca marche pour la somme (si je remplace sum(keyword), par sum(score) )
    Par contre, l'exemple que tu as repris ne marchait initialement pas pour la recherche car, comme je l'avais expliqué, il affiche les fichiers qui contiennent au moins l'un des mots. Ce que je souhaite c'est afficher les fichiers qui contiennent TOUT les mots.

  6. #6
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Compliquons encore un peu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT m1.file, sum(m1.score), 
    GROUP_CONCAT(DISTINCT IF(m1.`keyword` IN(1,3),m1.`keyword`,NULL) ORDER BY m1.`keyword`) AS kw
    FROM `moteur_key_word`m1
    WHERE EXISTS( SELECT m2.file,
    GROUP_CONCAT(DISTINCT IF(m2.`keyword` IN(1,3),m2.`keyword`,NULL) ORDER BY m2.`keyword`) AS k2
     FROM `moteur_key_word` m2
     WHERE m2.file=m1.file
     HAVING k2='1,3')
    GROUP BY m1.`file`
    HAVING kw='1,3'
    ORDER BY 2 DESC

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    L'idée est effectivement originale.
    Si j'entre la requête sans la modifier, mysql m'indique une erreur car il manque le 3ème argument du IF. Par contre, si j'entre NULL comme 3ème argument, ça marche... Sauf que à ce moment, sum(score) me renvoie la somme de tous les mots du fichier et pas seulement les mots 1 et 3.
    Mais merci, ça avance déjà bien. Par contre, si je pouvais éviter d'avoir à lancer 2 requêtes pour avoir et d'un coté la somme et de l'autre coté les bons résultats.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    En fait, je ne sais pas si la nouvelle requête est mieux que la précédente. La seule chose que je peux dire, c'est qu'elle tourne depuis environ 1h et que je n'ai toujours pas de résultat

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Je viens de trouver la bonne(?) idée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT file, sum(score), COUNT(*) as TOTAL
    FROM `moteur_key_word`
    WHERE (`keyword` = 10 OR `keyword` = 100)
    GROUP BY `file`
    HAVING TOTAL = 2
    ORDER BY 2 DESC
    LIMIT 0, 30
    En tout cas, merci à tous, mon MYSQL a bien progressé aujourd'hui
    et seulement 0.0550s pour 7M d'enregistrements.

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

Discussions similaires

  1. Requête avec conditions multiples (OR/AND) sur le même champ
    Par GueloSuperStar dans le forum Langage SQL
    Réponses: 31
    Dernier message: 05/03/2013, 11h42
  2. Réponses: 7
    Dernier message: 25/09/2012, 00h12
  3. Réponses: 2
    Dernier message: 31/01/2009, 21h49
  4. Requête avec conditions multiples sur le même champ
    Par skerdreux dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/06/2008, 20h15
  5. Réponses: 4
    Dernier message: 26/04/2006, 15h02

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