2015-07-03 13 views
5

Ho una casella di ricerca che mi piacerebbe avere la ricerca di 6 colonne nel mio database scuole quando viene effettuato un input. Finora la casella di ricerca cerca solo il campo del nome e restituisce una corrispondenza per gli input esatti o parziali.ricerca di più colonne con una o più parole chiave utilizzando sql

Vorrei cercare una città specifica e visualizzare tutti i risultati dal nome E colonne della città (anziché solo la colonna del nome) e così via.

Dire che volevo cercare con un codice di avviamento postale, vorrei che le inserzioni fossero tutte le scuole in quel codice di avviamento postale. E infine se inserisco 2 parole (ad es. Penn Philadelphia), vorrei che tutte le scuole Penn mostrassero solo la colonna nome E la colonna cittadina. (non solo tutti i pennini nel nome o in ogni scuola di Philadelphia) e così via. Queste potrebbero essere domande elementari sull'argomento, ma ho cercato giorni senza successo. Forse un utilizzo migliore dei caratteri jolly e le clausole "AND" "OR" potrebbero avvantaggiarmi.

Qualcuno può aiutarmi a strutturare una query sql per realizzare questo?

questo è quello che ho finora:

SELECT * FROM schools 
WHERE (name='%name%' OR address='%name%' OR city='%name%'OR zip='%name%') 
+0

è possibile utilizzare approcci multipli: ad esempio, di avere "penn" e "Philadelphia" si può fare: 'SELECT * FROM scuole dove name = 'penn' E città = 'philadelphia' ; 'puoi combinare insieme alcune condizioni. Un altro approccio: 'SELECT * FROM s1 scuola, s2 scuola ISCRIVITI ON s1.name = s2.name WHERE s1.name = 'penn' E s1.city = 'philadelphia';' qui si può anche utilizzare più join non vanno con esso, ma avere un buon indice aiuta quest'ultimo robusto – Hamed

+0

C'è anche un altro approccio che è possibile utilizzare alcuni SELECT nidificati (non consigliato), come si fa: 'SELECT * FROM schools WHERE (SELECT * FROM schools WHERE name = ' penn ') AS s1 AND city =' philadelphia '; '. Non andare troppo in profondità su questo, perché diventerebbe cattivo. Scegli quello che si adatta meglio – Hamed

+0

@RyanVincent beh non è proprio una risposta corretta più come alcuni suggerimenti – Hamed

risposta

4

Ci sono pochi modi per fare che- La strategia molto di base è quello di abbinare in ingresso con le nostre colonne della tabella dalla query come come lei ha ricordato -

1. SELECT * FROM table WHERE (name='%name%' or zip='%name%' or city='%name%'); 

2. SELECT * FROM table WHERE LOCATE(name, GROUP_CONCAT(name,city,zip)) > 0; 

3. 
SELECT * FROM table WHERE name like '%name%' 
      UNION 
SELECT * FROM table WHERE name like '%name%' 
      UNION 
SELECT * FROM table WHERE name like '%name%'; 

ma supponiamo il caso in cui casella di input ha il nome String "varun bharti" ma reale nel database è "varun bal bharti" Quindi, quando si esegue una ricerca si perse il record. in questo caso dovresti spezzare la stringa per spazio in elementi di matrice e usare queste query per gli elementi oppure puoi sostituire lo spazio nella colonna del nome e corrispondere.

set @var=REPLACE ('varun bharti', ' ', '%');  
SELECT * FROM table WHERE name like concat('%',@var,'%') or 
     zip like concat('%',@var,'%') or 
     city like concat('%',@var,'%'); 

È inoltre possibile utilizzare le espressioni regualar per quello. Ad stringa di esempio di input the day boss get

Hitesh> select * from test; 
+--------------------+ 
| name    | 
+--------------------+ 
| i am the boss  | 
| You will get soon | 
| Happy birthday bro | 
| the beautiful girl | 
| oyee its sunday | 
+--------------------+ 
5 rows in set (0.00 sec) 

Hitesh> set @var=CONCAT('.*',REPLACE('the day boss get',' ','.*|.*'),'.*'); 
Query OK, 0 rows affected (0.00 sec) 

Hitesh> select @var; 
+----------------------------------+ 
| @var        | 
+----------------------------------+ 
| .*the.*|.*day.*|.*boss.*|.*get.* | 
+----------------------------------+ 
1 row in set (0.00 sec) 

Hitesh> select * from test where name REGEXP @var; 
+--------------------+ 
| name    | 
+--------------------+ 
| i am the boss  | 
| You will get soon | 
| Happy birthday bro | 
| the beautiful girl | 
| oyee its sunday | 
+--------------------+ 
5 rows in set (0.00 sec) 
Problemi correlati