2013-05-21 2 views
1

Je veux écrire sql Requête pour un nombre inconnu de mots-clés. Les mots-clés (tags) sont stockés dans une table comme ceci Sql Requête pour un nombre inconnu de mots-clés

 
       column1 column2 
       item1  tag1 
       item1  tag2 
       item1  tag3 
       .   . 
       .   . 
       .   . 
     
Maintenant, l'utilisateur peut entrer n'importe quel nombre de mots-clés pour effectuer une recherche sur la table. Si le and est utilisé, il effectuera une recherche stricte. Si j'utilise or, il recherchera les éléments correspondant à un seul mot-clé. Je veux une requête qui se forme dynamiquement et utilise le maximum de mots-clés donnés dans la recherche sinon tous. Comme un Vehicle est l'objet et Il a les mots-clés. Car, Vehicle, conveyance, Cycle, Bike, truck. Maintenant, je veux entrer les mots-clés Bike Cycle dans la zone de texte de sorte qu'il devrait former la requête pour rechercher l'élément du véhicule.

+6

et quelle est votre question et qu'est-ce que vous avez essayé. – Zaki

+0

Comment dois-je écrire sqlquery pour un nombre inconnu de mots-clés à rechercher dans ce cas? –

+0

s'il vous plaît montrer votre exemple d'entrée et la sortie attendue – mvp

Répondre

3

Vous pouvez effectuer une recherche avec un opérateur OR ou une expression équivalente IN (...), regrouper les lignes par colonne d'élément et comparer les nombres de lignes. La ligne avec le plus grand nombre a le plus grand nombre de mots-clés de votre liste de recherche:

SELECT TOP 1 
    column1, COUNT(*) 
FROM mytable 
WHERE column2 IN ('tag1', 'tag3') 
GROUP BY column1 
ORDER BY COUNT(*) DESC 

Pour faire face à beaucoup de mots-clés sans exposer votre code à l'injection SQL, vous devez soit générer votre SQL dynamique, ou utilisez table- paramètres évalués.

Si vous prenez la première approche, l'expression IN devient IN (@tag0, @tag1, @tag2) jusqu'au nombre d'étiquettes dans votre chaîne de recherche. Créez une commande SQL et ajoutez des balises individuelles en tant que paramètres. Voir this answer pour plus de détails sur l'approche de requête dynamique.

Si la liste de tags augmente de manière significative, une approche alternative avec un paramètre table peut améliorer les performances de votre requête. This answer explique comment faire cela.

+0

J'ai adoré la solution ... –

+1

Et comment devraient-ils appeler cela à partir de leur application C#, * sans * exposer la base de données à SQL Injection? – RBarryYoung

+1

@RBarryYoung En utilisant SQL paramétré, bien sûr :) – dasblinkenlight

0

bien avec LINQ qui serait quelque chose comme (en supposant que vous avez une classe de modèle appelé Produits) et l'utilisateur a envoyer un tableau de mots-clés

IQueryable<Product> SearchProducts (params string[] keywords) 
{ 
IQueryable<Product> query = dataContext.Products; 

foreach (string keyword in keywords) 
    { 
    string temp = keyword; 
    query = query.Where (p => p.Description.Contains (temp)); 
    } 
    return query; 
} 

Pour des scénarios plus élaborés regarder

http://www.albahari.com/nutshell/predicatebuilder.aspx

+0

Merci, mais je ne suis pas très bien avec Linq .. –

+0

c'est dommage parce que c'est très utile et cela vous fera gagner beaucoup de temps. Si vous êtes intéressé par raw sql, je vais mettre à jour ma réponse. – idipous

0

Le voulez-vous?

SELECT * FROM TABLE O WH x Mots-clés dans (Select * FROM ListOfWantedKeywords) --La liste des mots-clés recherchés est votre recherche dynamique.

0

Cherchez vous?

et version:

SELECT 
    SRC.* 
FROM SRC 
WHERE NOT EXISTS (
    SELECT TOP(1) 
     1 
    FROM (
     VALUES 
      ('xxx') 
      , ('yyy') 
    ) AS KEYWORDS(Word) 
    WHERE SRC.col NOT LIKE '%' + Word + '%' 
) 

Ou Version:

SELECT 
    SRC.* 
FROM SRC 
WHERE EXISTS (
    SELECT TOP(1) 
     1 
    FROM (
     VALUES 
      ('xxx') 
      , ('yyy') 
    ) AS KEYWORDS(Word) 
    WHERE SRC.col LIKE '%' + Word + '%' 
) 
Questions connexes