Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2004
    Messaggi
    343

    [MYSQL] Estrarre parole vicine

    Ciao a tutti, ho una tabella di un database con un campo di tipo TEXT che contiene - appunto - del testo.
    Avrei bisogno di fare una query che mi permetta di estrarre da questo campo una parola specificata, se esiste, e restituire inoltre anche le 2-3 parole immediatamente vicine a questa, sia a destra che a sinistra, tipo:

    "Oggi è una bella giornata, il sole splende ed il cielo è blu cobalto"
    Ora, specificando la parola "sole" la query dovrebbe restituirmi:

    "giornata, il sole splende ed"
    un po' come fanno di solito i motori di ricerca...
    Avete qualche consiglio su come procedere?

    Io per la prima parte della query pensavo di fare una cosa del genere:

    codice:
    SELECT campo_testo FROM testi WHERE campo_testo REGEXP ('$termine_specificato')
    ma per la parte più difficile, cioè quella delle parole vicine, come posso fare?

    Grazie in anticipo per l'aiuto!

  2. #2
    Per la prima parte ti consiglio:

    codice:
    SELECT campo_testo FROM testi WHERE campo_testo LIKE '%termine_specificato%'
    Poi hai due opzioni:
    - lavori su campo_testo con un linguaggio di programmazione
    - in SQL invece, dovresti lavorare con le funzioni tipo SUBSTRING


  3. #3
    A proposito di questo, sto cercando il modo di sostituire il vecchio codice dei video di youtube (per embed esterni) col nuovo.

    Dovendo sostituire tutto un testo intorno ad una determinata variabile (codice del video che cambia sempre e che lo identifica con 11 cifre), come posso procedere?

    Esempio:

    "<Cose da sostituire del vecchio codice di un video con id=XXXXXXXXXXX che va cambiato con del nuovo testo>"

    Dovendo sostituire la prima parte con del testo e la seconda con un altro testo, lasciando invariato XXXXXXXXXXX, come posso fare?

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2004
    Messaggi
    343
    Originariamente inviato da zeta2011
    Per la prima parte ti consiglio:

    codice:
    SELECT campo_testo FROM testi WHERE campo_testo LIKE '%termine_specificato%'
    Poi hai due opzioni:
    - lavori su campo_testo con un linguaggio di programmazione
    - in SQL invece, dovresti lavorare con le funzioni tipo SUBSTRING

    Ciao, grazie anzitutto per il consiglio sulla query.
    Premetto che sto usando PHP con MYSQL, tu cosa mi consiglieresti? Io preferirei far fare il "lavoro sporco" a MYSQL...
    Tra l'altro avevo già pensato anche io a SUBSTRING o comunque a funzioni similari, tipo quelle elencate qui:

    http://dev.mysql.com/doc/refman/5.5/...tion_substring

    però non saprei come fare, probabilmente bisogna impiegarne diverse...tu hai qualche idea?
    Algoritmicamente penso sia una cosa del genere:

    1) estraggo il testo
    2) conto da sx quante parole ci sono prima di quella richiesta e memorizzo il valore in una variabile (es varLEFT)
    3) conto verso dx quante parole ci sono fino alla fine della stringa e memorizzo il valore in una variabile (es varRIGHT)
    4) impiegando varLEFT individuo le prime 3 parole subito a sx e con varRIGHT le successive 3 a dx e le stampo a video, mettendoci in mezzo quella cercata (una sorta di concatenazione).
    Ad occhio mi sembra un po' troppo complicato per farlo con MYSQL, a meno che non ci sia una funzione specifica...o un algoritmo migliore!

    Idee?

    Grazie!

  5. #5
    Sì, per me ti conviene farlo in PHP, se cerchi su Google (o se chiedi nella sezione PHP) magari trovi anche qualcosa di già fatto.

    In SQL non penso proprio esista una funzione simile, dovresti comunque lavorare sulle funzioni stringa che hai individuato.


  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    91
    Se vuoi farlo nella query per la parte a sinistra della parola ricercata potresti fare

    SELECT SUBSTRING_INDEX(
    (SELECT MID('Oggi è una bella giornata, il sole splende ed il cielo è blu cobalto',1,
    INSTR('Oggi è una bella giornata, il sole splende ed il cielo è blu cobalto','sole')-1)),' ', -4);

    Res: 'bella giornata, il '



    Modificando il -4 cambia il numero di parole alla sinistra di SOLE (cosi ne prende 3). Modificando leggermente la query(ti prendi la parte destra della stringa) e la concateni al risultato aggiungendo nel mezzo la parola ricercata.

  7. #7
    Interessante Talio, credo che seguirò questa strada per il mio problema relativo a youtube usando il comando replace. Grazie

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2004
    Messaggi
    343
    Originariamente inviato da Talion
    Se vuoi farlo nella query per la parte a sinistra della parola ricercata potresti fare

    SELECT SUBSTRING_INDEX(
    (SELECT MID('Oggi è una bella giornata, il sole splende ed il cielo è blu cobalto',1,
    INSTR('Oggi è una bella giornata, il sole splende ed il cielo è blu cobalto','sole')-1)),' ', -4);

    Res: 'bella giornata, il '



    Modificando il -4 cambia il numero di parole alla sinistra di SOLE (cosi ne prende 3). Modificando leggermente la query(ti prendi la parte destra della stringa) e la concateni al risultato aggiungendo nel mezzo la parola ricercata.
    Ciao grazie mille Talion, grandissimo!
    Ma per la parte destra, cioè per farmi restituire le parole subito dopo "sole", così per intenderci:

    splende ed il cielo
    come andrebbe modificata la query che mi hai gentilmente inviato?

    Grazie di nuovo!
    Ciao!

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    91
    L'ho fatta tutta intanto che c'ero


    SELECT CONCAT(

    (
    SELECT SUBSTRING_INDEX(
    (
    SELECT MID('Oggi è una bella giornata, il sole splende ed il cielo è blu cobalto',1,
    INSTR('Oggi è una bella giornata, il sole splende ed il cielo è blu cobalto','sole')-1)),' ', -4)
    )

    ,

    (
    SELECT SUBSTRING_INDEX(
    (
    SELECT MID('Oggi è una bella giornata, il sole splende ed il cielo è blu cobalto',
    INSTR('Oggi è una bella giornata, il sole splende ed il cielo è blu cobalto','sole'),
    LENGTH('Oggi è una bella giornata, il sole splende ed il cielo è blu cobalto'))),' ', 5)
    )

    );

    Res: 'bella giornata, il sole splende ed il cielo'

    Le due query lavorano sugli spazi come delimitatori per cui se nella frase ci fosse stato uno spazio prima della virgola veniva conteggiata come una parola perdendosi il bella. Per ovviare al problema dovrebbe bastare fare una replace

    Al posto del mid puoi usare il SUBSTRING se ti piace di più



  10. #10
    Utente di HTML.it
    Registrato dal
    Aug 2004
    Messaggi
    343
    Fantastico Talion, funziona alla grande, grazie di nuovo ti devo una birra!

    Originariamente inviato da Talion

    Le due query lavorano sugli spazi come delimitatori per cui se nella frase ci fosse stato uno spazio prima della virgola veniva conteggiata come una parola perdendosi il bella. Per ovviare al problema dovrebbe bastare fare una replace
    Ho fatto l'esperimento, in effetti se dopo la virgola ci metto uno spazio come dici anche tu il "bella" sparisce poiché la virgola viene conteggiata come parola e ottengo questo:

    giornata , il sole splende ed il cielo
    Quando dici di fare una replace, intendi forse una cosa del genere:

    codice:
    SELECT REPLACE('Oggi è una bella giornata , il sole splende ed il cielo è blu cobalto', ' ,', ',');
    cioè sostituisco lo spazio-virgola con una virgola...giusto?

    Ciao!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.