• User

    MySQL - Contare quante volte è presente una stringa in un campo

    Ciao a tutti,
    avrei la necessità di contare quante volte è presente una certa stringa in un campo in modo da ordinare i risultati per il numero restituito.

    Io ho il manuale di MySQL di Paul Dubois (quello di 1200 pagine), ma non parla di una funzione che faccia al caso mio. Ho guardato su internet e anche qui non ho trovato niente. :bho:

    Sapete dirmi se c'è una funzione mysql che fa questo lavoro, o magari consigliarmi un metodo alternativo?

    Spero di essermi spiegato bene.

    Attendo i vostri preziosi consigli... :ciauz:


  • User Attivo

    Ciao jAmes.87,
    per quanto concerne mysql non saprei... però con php è facile:

    $tot=substr_count($stringa, $parola);

    con ovvio significato delle variabili.
    Quello che ti posso consigliare è di fare una query semplice e sfruttare poi php per contare ed ordinare...

    Facci sapere se così risolvi!
    :ciauz:


  • User

    @ceccus said:

    Ciao jAmes.87,
    $tot=substr_count($stringa, $parola);
    Quello che ti posso consigliare è di fare una query semplice e sfruttare poi php per contare ed ordinare...

    Ciao ceccus... 🙂

    Fare in questo modo è di sicuro più semplice e sbrigativo per chi programma.

    Inoltre questo metodo è buono se ogni volta si vogliono mostrare tutti i record senza la paginazione dei risultati.

    Invece, se si vogliono dividere in pagine i risultati, dove nella prima pagina ci sono i record che contengono + stringhe, il caricamento e la stampa dei risultati risulterebbero molto più lenti di una procedura eseguita da mysql.

    Motivo
    Ogni volta si dovrebbe:

    • recuperare TUTTI i record
    • leggerli TUTTI con php per trovare quante stringhe contengono i campi
    • ordinarli TUTTI per numero di stringhe trovate
    • BUTTARE VIA tutti gli altri record che non fanno parte del range delle pagine che si vogliono vedere.

    Come ho risolto
    Non è che ho risolto... mi sono adeguato alla situazione.:bho:
    Cioè, con mysql metto prima i record in cui le stringhe cercate sono state trovate sia nel titolo e nel contenuto, poi i record in cui le stringhe sono state trovate nel titolo e i record in cui le stringhe sono state trovate nel contenuto.
    Nota: questo ordinamento è possibile farlo utilizzando gli indici FULLTEXT che ti permettono di calcolare la "rilevanza" dei record in cui sono state trovate le stringhe. Quindi si ordina per "Rilevanza_Titolo DESC, Rilevanza_Contenuto DESC".

    Per chi non predente troppo, credo che sia sufficiente... :smile5:


  • Bannato User Attivo

    l'unico modo "indolore" che mi viene in mente per farlo è creare un indice fulltext sul campo è fare una query del tipo:
    SELECT *, MATCH(nomecampo) AGAINST('stringa da cercare') AS attinenza FROM tabella WHERE MATCH(nomecampo) AGAINST('stringa da cercare') ORDER BY attinenza DESC
    in questo modo dovresti ottenere qualcosa di molto simile a quello che ti serve solo ti manca il numero di volte che la stringa appare nel campo, ma se proprio ti serve quello lo fai successivamente come suggerito da ceccus.
    Occhio che se vuoi che tutti i termini cercati appaiono nel campo devi scrivere la query diversamente, ma questo sul tuo manuale ci sarà scritto.

    [edit]
    a quanto pare, sono arrivato con un attimo di ritardo...