MySQL

2008-09-01 15 views
1

'daki bir metin alanından X sözcükleri seçiyorum LIKE (tam metin kullanıyorum ama şu anda yapamıyorum) kullanarak temel bir arama işlevi yapıyorum ve MySQL'in arama yapıp yapamayacağını merak ediyorum. Bir anahtar kelime (örn. WHERE alanı LIKE '% word%'), anahtar kelimenin her iki tarafında da 20 kelime döndürür?MySQL

cevap

2

bunu sen SUBSTRING_INDEX

kullanarak sorguda hepsini yapabilirsiniz yayınlayacağız eğer benim RegexBuddy sorulabilse daha sonra nasıl test edecek
CONCAT_WS(
' ', 
-- 20 words before 
TRIM(
    SUBSTRING_INDEX(
     SUBSTRING(field, 1, INSTR(field, 'word') - 1), 
     ' ', 
     -20 
    ) 
), 
-- your word 
'word', 
-- 20 words after 
TRIM(
    SUBSTRING_INDEX(
     SUBSTRING(field, INSTR(field, 'word') + LENGTH('word')), 
     ' ', 
     20 
    ) 
) 

)

+0

i eşleştirme yapmak için birden fazla kelime varsa? ne yapmalıyım? – davidlee

0

Dizede sözcüğün konumunu bulmak için INSTR() işlevini kullanın ve ardından karakterin bir bölümünü konumdan önce ve sonra seçmek için SUBSTRING() işlevini kullanın.

SUBSTRING yönergelerinizin negatif değerler kullanmadığına veya garip sonuçlar alacağına dikkat etmeniz gerekir.

Bunu deneyin ve rapor edin.

1

Ben ancak karakter sayısı,

SELECT SUBSTRING(field_name, LOCATE('keyword', field_name) - chars_before, total_chars) FROM table_name WHERE field_name LIKE "%keyword%" 
  • chars_before gibi bir şey yapabileceğini iade sınırlamak için, kelimelerin sayısı döndürülür sınırlamak için onun mümkün düşünmüyorum - karakter sayısıdır sen anahtar kelime (ler)
  • total_chars önce seçmek isteyen - Eğer isteyen karakterlerin toplam sayısı seçmektir
Aşağıdaki örnekte, yani

anahtar kelime önce 15 karakter gelen bakan veri 30 karakter dönmek

SUBSTRING(field_name, LOCATE('keyword', field_name) - 15, 30) 

Not: Aryeh belirttiği gibi altdizgesi herhangi bir negatif değerler() hatırı sayılır bir alçaklardan - örneğin, anahtar kelime, alanın ilk [chars_before] karakterleri içinde bulunur, daha sonra alandaki son [chars_before] karakter kartaları verilir.

0

Bence en iyi seçeneğin sonucu SQL sorgusuyla elde etmek ve aranan kelimeden önce ve sonra bir grup kelime almanıza izin veren düzenli bir ifade uygulamak.

Şimdi bunu test edemez, ancak düzenli ifade gibi bir şey olmalı: Eğer sonra sıra 2 arandı kelime için WORD değiştirip öncesi kelimeler olarak regex grubu 1 kullanın ve nerede

.*(\w+)\s*WORD\s*(\w+).* 

-kelime

işe yarayacak :) ve burada