2010-07-06 5 views
0

Ma déclaration sqlComment trier en fonction du mot-clé recherché?

SELECT * 
    FROM mytable 
WHERE (CONTAINS(keyword,' "green" ')) 

Comment puis-je inscrire haut appariées résultat comme celui-ci

Green 
Army Green 
Hunter Green 

au lieu du dessous

Army Green 
Green 
Hunter Green 

Je sais que nous ne pouvons pas utiliser l'ordre par asc ou desc avec mon cas.

Je prévois d'ajouter un espace avant 'vert' et d'utiliser l'objet dictionnaire ou d'insérer dans la base de données et de trier l'ordre alpha. Je pense qu'il existe une meilleure technique ici qui peut faire le travail au lieu d'utiliser ma technique lente traitant spécialement de plus de plusieurs millions d'enregistrements dans la base de données de mots-clés.

Par ailleurs, nous utilisons encore l'ancien SQL Server 2000.

ce sont les mots clés qui est lié au vert. J'aime obtenir le meilleur résultat en fonction du mot-clé input. Le résultat devrait montrer la correspondance la plus proche du mot-clé.

données dans la base de données

Army Green 
Blue-Green 
Bright Green 
British Racing Green 
Camouflage Green 
Dark Green 
Dark Pastel Green 
Electric Green 
Fern Green 
Forest Green 
Green 
Green-Yellow 
Hunter Green 
India Green 
Islamic Green 
Jungle Green 
Kelly Green 
Lawn Green 
Lime Green 
Moss Green 
MSU Green 
Office Green 
Pastel Green 
Persian Green 
Pine Green 
Sea Green 
Shamrock Green 
Spring Green 
Tea Green 
Yellow-Green 
+0

Je ne comprends pas très bien ce que vous cherchez. Pouvez-vous nous indiquer des valeurs de «mot clé» et l'ordre dans lequel vous vous attendez à les trouver? –

+0

s'il vous plaît voir ma réponse ci-dessous. Ce site ne permet pas de faire un saut de ligne sur le commentaire – DARWIN

+0

s'il vous plaît voir mon article édité ci-dessus. merci – DARWIN

Répondre

0

Eh bien, vous pouvez-cas particulier correspond exactement:

SELECT * 
    FROM mytable 
WHERE keyword = 'green' 
UNION ALL 
SELECT * 
    FROM mytable 
WHERE (CONTAINS(keyword,' "green" ')) 
    AND keyword <> 'green' 
0

Je ne sais pas exactement ce que vous êtes après, et je ne suis pas très familier avec la recherche en texte intégral, mais peut-être que vous pourriez simplement commander par len(keyword).

Cela fonctionnerait pour votre exemple, de toute façon. Il ne serait pas prioriser les lignes avec plus d'une instance de "vert" cependant.

1

Peut-être ...

SELECT * 
    FROM mytable 
    WHERE (CONTAINS(keyword,' "green" ')) 
    ORDER BY FIND_IN_SET('green', keyword); 

FIND_IN_SET MySQL bien; vous ne pouvez pas l'avoir. Il retourne juste la position du mot «vert» dans la colonne de mot-clé. SQL Server semble avoir CHARINDEX('green', keyword) si cela peut vous aider.

+0

find_in_set n'est pas disponible avec ms sql – DARWIN

+1

Nos mises à jour se sont croisées. Que diriez-vous CHARINDEX - voir http://msdn.microsoft.com/en-us/library/aa258228%28SQL.80%29.aspx pour plus. –

+0

OMG, c'est ce dont j'ai besoin. Merci beaucoup. – DARWIN

0

Il semble que vous essayez de trouver la fréquence des mots-clés "verts"?

Supposons que vous table (s) ressemblais cette (Fournir la description complète et exacte.):

CREATE TABLE mytable (item VARCHAR(40), keyword VARCHAR(100)) 

INSERT INTO mytable (item, keyword) 
SELECT  'room 01', 'Green'    UNION ALL 
SELECT  'room 02', 'Green'    UNION ALL 
SELECT  'room 03', 'Green'    UNION ALL 
SELECT  'room 04', 'Army Green'   UNION ALL 
SELECT  'room 05', 'Army Green'   UNION ALL 
SELECT  'room 06', 'Hunter Green'  UNION ALL 
SELECT  'room 07', 'Some Other Color' 

.

Ensuite, on obtient les résultats escomptés par:

SELECT  keyword, COUNT (item) AS cnt 
FROM  mytable 
WHERE  keyword LIKE '%green%' 
GROUP BY keyword 
ORDER BY cnt DESC 

/* 
Yields: 
    keyword   cnt 
    ------------ --- 
    Green   3 
    Army Green  2 
    Hunter Green 1 
*/ 

.

Ou, si l'indexation en texte intégral est en cours d'utilisation:

SELECT  keyword, COUNT (item) AS cnt 
FROM  mytable 
WHERE  (CONTAINS(keyword,' "green" ')) 
GROUP BY keyword 
ORDER BY cnt DESC 

.
Si mot-clé est une text ou ntext colonne:

SELECT  CAST (keyword as VARCHAR(8000)), COUNT (item) AS cnt 
FROM  mytable 
WHERE  (CONTAINS(keyword,' "green" ')) 
GROUP BY CAST (keyword as VARCHAR(8000)) 
ORDER BY cnt DESC 
-1

Je suis venu avec une solution en utilisant le la PATINDEX et avec fonction CASE pour créer la colonne faux et le tri de la colonne faux et ça fonctionne bien.

Merci les gars

+0

** MONTRER ** votre solution. Surtout que la question n'était pas si claire. –

Questions connexes