2015-07-03 12 views
5

Mam jedno pole wyszukiwania, które chciałbym przeszukać 6 kolumn w mojej bazie danych szkół po wprowadzeniu danych. Do tej pory pole wyszukiwania przeszukuje tylko pole nazwy i zwraca dopasowanie dla dokładnych lub częściowych danych wejściowych.przeszukiwanie wielu kolumn za pomocą co najmniej jednego słowa kluczowego przy użyciu sql

Chciałbym wyszukać konkretne miasto i wyświetlić wszystkie wyniki z kolumn nazw i ORAZ miasta (zamiast tylko kolumny nazwy) i tak dalej.

Załóżmy, że chcę wyszukać z kodem pocztowym, chciałbym aby wszystkie aukcje były szkołami w tym kodzie pocztowym. I na koniec, jeśli wprowadzę 2 słowa (na przykład penn Philadelphia), chciałbym, aby wszystkie szkoły w Penn pokazały, że są tylko w kolumnie nazwa I kolumna miasta. (nie tylko wszystkie penns w nazwie lub każdej szkole w Filadelfii) i tak dalej. Może to być elementarne pytanie w tej sprawie, ale szukam dni bez powodzenia. Być może lepsze wykorzystanie symboli wieloznacznych i klauzul "OR" "OR" przyniosłoby mi korzyść.

Czy ktoś może mi pomóc sformułować kwerendę sql, aby to osiągnąć?

to, co mam do tej pory:

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

można korzystać z wielu metod: na przykład mieć "Penna" i "Filadelfia" można zrobić: 'SELECT * FROM szkół WHERE name = 'Penn' AND city = 'Filadelfia' ; 'możesz połączyć kilka warunków razem. Inne podejście: SELECT * FROM school s1, school s2 JOIN ON s1.name = s2.name WHERE s1.name = 'penn' AND s1.city = 'philadelphia'; 'tutaj możesz także użyć wielu złącz nie idź dzika z nim, ale posiadanie dobrego indeksu pomaga temu drugiemu solidnemu – Hamed

+0

Istnieje również inne podejście, w którym możesz użyć kilku zagnieżdżonych SELEKTÓW (niezalecanych), tak jak ty: 'WYBIERZ * ZE SZKOŁY, GDZIE (WYBIERZ * ZE SZKÓŁ, GDZIE nazwa = ' penn ') AS s1 AND city =' philadelphia '; '. Nie zagłębiaj się w to zbyt głęboko, bo byłoby nieprzyjemnie. Wybierz to, co pasuje najlepiej – Hamed

+0

@RyanVincent dobrze to nie jest prawdziwa odpowiedź bardziej jak kilka wskazówek – Hamed

Odpowiedz

4

Istnieje kilka sposobów na to, że- Bardzo podstawowy strategia jest, aby dopasować wkład z naszych kolumn tabeli w zapytaniu jak jak wspomniano -

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%'; 

ale załóżmy przypadek, gdy pole wprowadzania mamy String "varun bharti" ale rzeczywistą nazwę w bazie jest "varun bal bharti" więc podczas wyszukiwania będzie brakowało rekord. w tym przypadku należy rozbić łańcuch znaków przez spację w elementach tablicy i użyć tych zapytań dla elementów lub zastąpić spację w kolumnie nazwy i dopasować.

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

Można również użyć wyrażenia regualar dla tego. STRING przykład wejściowego 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)