2013-04-02 4 views
1

je le tableau suivantSQLite comme requête pour plusieurs lignes

--------------------------------------- 
id,  type,  keyword,  default 
--------------------------------------- 
1,  1,  mcdonalds,  1 
2  1,  food,   0 
3,  1,  drinks,   0 
4,  2,  vending machine, 1 
5,  2,  drinks,   0 
6,  3,  station,   1 
7,  3,  travel,   0 
8  3,  train,   0 

L'idée sous-jacente est que je veux une requête serach returing type « un unique » pour les mots clés (la ligne par défaut), alors quand je cherche McDonald, je reçois le premier rang, mais quand je cherche de la nourriture ou des boissons, je reçois aussi le premier rang.

Je l'ai fait en utilisant un sous-ensemble.

SELECT type, keyword FROM keywords WHERE type IN (SELECT DISTINCT type FROM keywords WHERE keyword like '%?%') AND `default`=1 
; 

Cela fonctionne comme un charme, maintenant mais je veux être en mesure de donner plusieurs mots-clés, par exemple « boissons & nourriture » J'ai essayé

SELECT type, keyword FROM keywords WHERE type IN (SELECT DISTINCT type FROM keywords WHERE keyword like '%?%' OR keyword like'%?%') AND `default`=1 
; 

Mais quand je recherche « nourriture & boit "dans ce cas j'obtiendrais à la fois" le distributeur automatique "et les" McDonald ". Cependant, le distributeur automatique n'a qu'un mot-clé "boissons" assosié (il ne sert pas de nourriture) donc je ne veux pas celui-là dans mes résultats.

Lorsque je fais 'ET' au lieu de OU comme, je n'obtiens aucun résultat (puisque une ligne ne peut pas avoir les deux valeurs en même temps).

Quelqu'un at-il des suggestions sur la façon dont je pourrais résoudre ce problème?

Répondre

1

Utilisez Deux sous-requêtes indépendantes, puis combiner les AND avec lookups:

SELECT type, 
     keyword 
FROM keywords 
WHERE type IN (SELECT DISTINCT type FROM keywords WHERE keyword like '%drinks%') 
    AND type IN (SELECT DISTINCT type FROM keywords WHERE keyword like '%food%') 
    AND "default"=1 
+1

votre requête retourne toujours un enregistrement et si add 3 mot-clé 'AND type IN (SELECT DISTINCT type FROM mots-clés WHERE mot-clé comme '% station%')' il ne renvoie rien – cetver

+1

Il retournera deux enregistrements s'il y a deux types où les deux mots-clés correspondent. –

+0

Ouais, ça marche un peu, mais ce n'est pas ce que je cherche, quand je cherche quelque chose comme "e d" ça va se montrer comme tout parce que c'est trop gourmand. – Matthijn

1
/* 
t = keywords 
*/ 

SELECT * 
FROM t 
WHERE type IN (
    SELECT type 
    FROM (
     SELECT COUNT(id) AS count_matches, 
      type 
     FROM t 
     WHERE keyword LIKE '%drinks%' 
     OR keyword LIKE '%food%' 
     GROUP BY type 
     ) 
     q 
    ORDER BY count_matches DESC 
    LIMIT 1 
    ) 
AND "default" = 1 
+1

Cela renvoie toujours un enregistrement, même si les mots clés correspondent à deux ou zéro types. –

+0

Basé sur question, besoin de retourner le mot-clé par défaut avec les meilleures correspondances maximum – cetver

+1

Votre requête renvoie en effet un type avec le plus de correspondances, mais ce n'est pas comment j'ai interprété la question ... –

0

Eh bien, merci pour votre aide. Il a été compris! :)

SELECT type, keyword FROM keywords WHERE type IN 
(SELECT type FROM keywords WHERE (`keyword` LIKE '%drinks%' OR keyword like '%food%') AND `default`!= 1 GROUP BY type HAVING COUNT(id) >= 2) 
AND `default`=1 

La requête peut être générée dynamiquement, ce qui signifie que vous utilisez COUNT. Le nombre de lignes pour le nombre renvoyé dans la sous-requête doit être au moins égal au nombre de mots clés que l'utilisateur a saisis.

[b] modifier ne semble pas fonctionner, ou le et donne parfois comme un nombre plus élevé que prévu [/ b]

Questions connexes