Domanda

Diciamo che ho un FirstName> MiddleName> gerarchia Cognome (~ righe 10k, per amore della questione). Questo significa che si potrebbe avere "John> Mary-Anne> Eddy" o "Eddy> Giovanni> Jacob" fila. Il punto è che la gerarchia ha poco senso ed è molto estera per l'utente (a differenza, per esempio, un Paese> Stato> Struttura City).

Perché il suo modo destrutturato e confuso, voglio fornire all'utente una casella di input di completamento automatico. Mentre si digita, si dovrebbe cercare possibili corrispondenze sottostringa, e quando "root" la stringa di ricerca a livello, sarà quindi limitare i risultati al di sotto di tale livello.

Ora, perché ci sono un sacco di persone di nome "John", non ha molto senso che se si digita "John" hanno solo tornare risultati come

  • Giovanni> Allen> Alexander
  • Giovanni> Allen> Burschawitz
  • Giovanni> Allen ... ripetere 100 volte ...

Perché vedranno mai la fila unica "Jason> Giovanni> Smith".

Invece, essi dovrebbero tornare qualcosa di simile ( "*" è solo un indicatore arbitrario per l'utente di "hey, molto altro ancora righe sotto questo esiste"):

  • Giovanni> Allen> *
  • Jason> Giovanni> Smith
  • Mike> Giovanni> *
  • Maria> Elena> Johnason

Se si digita "John> Al" allora i risultati sarebbero limitati a nulla sotto "John>", ma dovrebbero essere raggruppati in modo simile a sopra.

Spero che la spiegazione è chiara. I requisiti sono un po 'allentato. Proprio quelli ragionevoli, in modo che una persona può cercare attraverso l'albero e trovare ciò che sono dopo.

In questo momento, ho qualche SQL interessante che cerca il termine di ricerca nella riga, figure la sua posizione, fa qualche substring'ing, piazzole di sosta di gruppo, e l'ordine da parte del per ottenere i risultati di cui sopra, ma la sua non eseguire abbastanza bene .

Sto cercando di risolvere questo problema in un tipico stack LAMP (tranne che con Oracle). La sua non è hosting condiviso, così io ho il pieno controllo del server. I dati cambia piccole quantità ogni poche settimane, ed i risultati di ricerca può rimanere stantio per un ragionevole lasso di tempo (per esempio, un cron che aggiorna l'indice di ricerca non è fuori questione).

È stato utile?

Soluzione

Argh. Mi dispiace non ero in grado di descrivere il mio problema. In ogni modo, ecco la soluzione mi è venuta.

In sostanza, creare una seconda tabella dalla tabella 3-colonna che contiene tutti i valori distinti per ogni successivo livello della gerarchia, nonché una colonna per indicare la profondità di tale riga nella gerarchia.

es. Da mytable(A, B, C), creare search_t(A, B, C, level)

Così, con "One> Due> Tre", si crea 3 file (A, B, C, livello):

  • "One", null, null, 1
  • "One", "Due", null, 2
  • "One", "Two", "Tre", 3

Durante la ricerca, è possibile limitare il livello con la scelta di un valore per il livello e di fornire i valori per le colonne di livello superiore:

WHERE A='One' and level > 1 and (B like '%t%' or C like '%t')

Può essere un po 'semplificato e generico se si crea una colonna search_str ed eseguire l'abbinamento LIKE contro che, invece.

WHERE A='One' and level > 1 and search_str like '%t%'

A posteriori, questo sarebbe stato probabilmente più evidente se i dati erano già in un modello liste di adiacenza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top