2015-07-03 11 views
5

Ich habe ein Suchfeld, das ich 6 Spalten in meiner Schuldatenbank suchen möchte, wenn eine Eingabe gemacht wird. Bisher durchsucht das Suchfeld nur das Namensfeld und gibt eine Übereinstimmung für exakte oder partielle Eingaben zurück.Suche mehrere Spalten mit einem oder mehreren Schlüsselwörtern mit sql

Ich würde gerne nach einer bestimmten Stadt suchen und alle Ergebnisse aus dem Namen UND Stadt Spalten (und nicht nur die Name Spalte) und so weiter.

Angenommen, ich wollte mit einer Postleitzahl suchen, ich möchte, dass die Einträge alle Schulen in dieser Postleitzahl sind. Und schließlich, wenn ich 2 Wörter eingib (z. B. Penn Philadelphia), möchte ich, dass alle Penn-Schulen zeigen, dass sie nur in der Spalte Name UND in der Stadt sind. (nicht nur alle Penns im Namen oder jede Schule in Philadelphia) und so weiter. Das mag eine elementare Frage sein, aber ich habe Tage lang erfolglos gesucht. Vielleicht würde mir eine bessere Verwendung von Platzhaltern und den "AND" "OR" -Klauseln zugute kommen.

Kann mir jemand helfen, eine SQL-Abfrage zu strukturieren, um dies zu erreichen?

das ist, was ich bisher:

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

können Sie mehrere Ansätze verwenden: zum Beispiel "penn" zu haben und "Philadelphia" Sie tun können: SELECT * FROM Schulen WHERE name = 'penn' AND Stadt = 'Philadelphia' ; 'Sie können einige Bedingungen miteinander kombinieren. Ein anderer Ansatz: 'SELECT * FROM Schule s1, Schule s2 JOIN ON s1.name = s2.name WHERE s1.name = 'penn' AND s1.city = 'philadelphia';' Hier können Sie auch mehrere Joins verwenden gehen Sie nicht wild mit ihm, aber mit einem guten Index hilft letzteres robust – Hamed

+0

Es gibt auch einen anderen Ansatz, den Sie ein paar geschachtelte SELECTs verwenden können (nicht empfohlen), wie Sie tun: 'SELECT * FROM Schulen WHERE (SELECT * FROM Schulen WHERE name = ' penn ') AS s1 UND city =' philadelphia '; '. Gehen Sie nicht zu tief darauf, da es unangenehm werden würde. Wählen Sie, was am besten zu Ihnen passt – Hamed

+0

@RyanVincent es ist nicht wirklich eine richtige Antwort mehr wie ein paar Tipps – Hamed

Antwort

4

Es gibt nur wenige Möglichkeiten, dass- Die grundlegende Strategie ist eingespeisten Signals mit unseren Tabellenspalten durch die Abfrage wie wie Sie erwähnt zu tun -

aber angenommen, der Fall, wo Eingabefeld haben die Zeichenfolge-"varun bharti" aber der tatsächliche Name in der Datenbank ist "varun bal bharti" Also, wenn Sie suchen, werden Sie den Datensatz verpasst. Für diesen Fall sollten Sie die Zeichenfolge durch Leerzeichen in Array-Elemente aufteilen und diese Abfragen für Elemente verwenden, oder Sie können das Leerzeichen in der Spalte name und match ersetzen.

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

Sie können auch reguläre Ausdrücke dafür verwenden. Zum Beispiel Eingabestring 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) 
Verwandte Themen