2008-11-25 8 views
1

Nous avions l'habitude d'avoir une recherche, qui vérifie deux colonnes pour quelques mots. Les deux colonnes doivent contenir des mots fournis, donc nous utilisons AND ... sans aucun doute FULLTEXT INDEX est utilisé sur les colonnes.Est-il possible d'utiliser CONTAINSTABLE pour rechercher "mot1" dans la colonne1 ET "mot2" dans la colonne2

La sélection est plus ou moins comme ceci:

SELECT 
    * 
FROM SomeTable 
WHERE (CONTAINS(Column1, 'word1 OR word2') AND CONTAINS(Column2, 'word3 OR word4')) 

maintenant nous avons besoin d'ajouter le classement au résultat. Nous aimerions utiliser la fonctionnalité CONTAINSTABLE ... pour une seule colonne c'est simple. Quelque chose comme:

SELECT 
    SomeTable.*, 
    tmp.RANK 
FROM SomeTable 
INNER JOIN CONTAINSTABLE(SomeTable, Column1, 'word1 OR word2') as tmp 
ON tmp.[KEY] = SomeTable.ID 

Est-il possible de le faire avec 2 colonnes Mais considérez que je ne dois rechercher word1 ou mot2 à colonne1 (pas intéressé si nous avons word1 ou mot2 à colonne2). Considérons également ET qui était dans la clause where. Y at-il quelque chose comme:

SELECT 
    SomeTable.*, 
    tmp.RANK 
FROM SomeTable 
INNER JOIN CONTAINSTABLE(SomeTable, (Column1, Column2), 'column1:(word1 OR word2) AND column2:(word3 OR word4)') as tmp 
ON tmp.[KEY] = SomeTable.ID 

Répondre

2

Vous pouvez le faire avec une jointure interne sur une deuxième CONTAINSTABLE, bien que vous voudrez peut-être faire quelque chose d'un peu plus fantaisistes que d'ajouter les rangs ensemble que j'ai dans l'échantillon

SELECT 
    SomeTable.*,  
    col1.RANK + col2.RANK 
FROM 
    SomeTable 
INNER JOIN CONTAINSTABLE(SomeTable, Column1, 'word1 OR word2') as col1 ON 
    col1.[KEY] = SomeTable.ID 
INNER JOIN CONTAINSTABLE(SomeTable, Column2, 'word3 OR word4') as col2 ON 
    col2.[KEY] = SomeTable.ID 
+0

Je n'aime pas l'idée des jointures multiples et en utilisant cela, vous ne pouvez pas définir un sommet à CONTAINSTABLE (alors vous pourriez perdre les bons résultats). La somme de la valeur supérieure du classement dépend également du nombre de jointures. MAIS ... cela fonctionne, donc à moins qu'il y ait une meilleure réponse, je vais prendre celui-ci. – Dandikas