Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    mysql confronto tabelle senza join

    Salve a tutti,
    ecco il problema in cui mi sono imbattutto oggi.
    Ho due tabelle:

    la prima registroclienti con i campi cf e ragionesociale
    la seconda pagamentibanca con i campi importo e descrizione

    all'interno del campo descrizione, che è formato da 500 caratteri, è quasi sempre indicato il cf ma essendo pagamenti fatti da clienti diversi su banche diverse non è mai scritto nella stessa posizione.
    Per trovare i clienti che hanno pagato ho costruito questa query:

    SELECT importo, descrizione, cf, ragionesociale FROM registroclienti, pagamentibanca WHERE descrizione LIKE CONCAT('%',cf,'%')

    La query funziona e mi estrae i clienti con pagamenti il problema è che essendo le due tabbelle molto grosse (500.000 clienti su 20.000 pagamenti) per completare la query ci vuole moltissimo tempo. C'è un modo più efficente di confrontare le due tabelle? Pensavo di utilizzare un indice fulltext ma da quanto ho letto sul manuale mysql sembra che consenta solo confronti tra i campi indicizzati e una stringa ma non tra due campi.
    Qualche idea?

  2. #2
    La soluzione efficiente e' strutturare il database in maniera sensata. Ad esempio, se hai una tabella pagamenti mi aspetto come minimo i campi: importo, cliente, banca (piu' altri tipo id dell'operazione, data, motivazione e via dicendo).

    Mettere tutto in un campo di testo e' inefficiente, scomodo e contrario a qualunque regola di buon utilizzo di un database.

  3. #3
    non sono un esperto di mysql ma potresti mettere un limit e impaginare...
    poi aspetta consigli + autorevoli

  4. #4
    per kb
    la tabella pagamentibanca non l'ho costruita io è semplicemente lo scarico dal sito della banca dell'estratto conto elettronico

  5. #5

    risolto

    è possibile usare il LIKE anche per fare il JOIN tra due tabelle quindi ho modificato la query così

    SELECT importo, descrizione, cf, ragionesociale FROM registroclienti INNER JOIN ON pagamentibanca.descrizione LIKE CONCAT('%',registroclienti.cf,'%')

    certo non è veloce come una query dove il JOIN è fatto con un = ma sicuramente è più efficente di come l'avevo scritta prima

  6. #6
    io aggirerei il problema aggiungendo 2 colonne nella tabella pagamentibanca, tipo:
    id, importo, descrizione, cf, analizzare

    poi creati uno script automatico che estrae dalla tabella tutti i record che hanno il valore di "analizzare" = N, per ciascuno di essi estrai dalla descrizione il CF e mettilo nel campo cf, ovviamente cambia il valore di ANALIZZARE = S

    a questo punto saprai quali righe hai elaborato estraendone il cf e quali no

    la tua query di ricerca iniziale ora puoi espanderla similmente a questa:

    SELECT pagamentibanca.importo, pagamentibanca.descrizione, registroclienti.cf, registroclienti.ragionesociale FROM registroclienti, pagamentibanca WHERE registroclienti.cf = pagamentibanca.cf and pagamentibanca.analizzare = 'S'

    p.s. occhio a forzare in maiuscolo sempre il CF in entrambe le tabelle, nel momento in cui salvi il dato in quel campo.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.