Wie führe ich eine einfache ein-Anweisung, die SQL für die Suche in Tabellen?

StackOverflow https://stackoverflow.com/questions/56334

  •  09-06-2019
  •  | 
  •  

Frage

Angenommen, es gibt zwei Tabellen: users und groups.

Wie wird man eine "einfache Suche", in dem der Benutzer text eingibt und die Ergebnisse enthalten sowohl Benutzer als auch Gruppen, deren Namen enthalten, der text?

Das Ergebnis der Suche muss unterscheiden zwischen zwei Arten.

War es hilfreich?

Lösung

Der Trick eine UNION mit einer Zeichenkette zu kombinieren, ist die Art von ‚Objekt‘ zu bestimmen, zurückgegeben. In den meisten (?) Fällen wird UNION ALL effizienter sein und sollte verwendet werden, wenn Duplikate in den Unterabfragen benötigt werden. Das folgende Muster soll genügen:

 SELECT "group" type, name
   FROM groups
  WHERE name LIKE "%$text%"
UNION ALL
 SELECT "user" type, name
   FROM users
  WHERE name LIKE "%$text%"

Hinweis : Ich habe die Antwort selbst hinzugefügt, weil ich über dieses Problem gestern nicht gekommen, um eine gute Lösung finden konnte, und verwenden diese Methode. Wenn jemand eine bessere Lösung hat, können Sie sich frei, um es hinzuzufügen.

Andere Tipps

Wenn Sie „UNION ALL“ dann die db versucht nicht, um Duplikate zu entfernen -. Sie werden nicht Duplikate zwischen den beiden Fragen haben sowieso (da die erste Spalte unterschiedlich ist), so UNION ALL wird schneller sein
(Ich gehe davon aus, dass Sie nicht über Duplikate in jeder Abfrage, die Sie entfernen möchten)

LIKE verwendet eine Reihe von Problemen führen, da es eine Tabelle jedes Mal scannen erfordern wird, wenn der LIKE Komparator mit einem% beginnt. Diese Kräfte SQL jede einzelne Zeile zu überprüfen und zu arbeiten, es ist Art und Weise, Byte für Byte, durch die Zeichenfolge, die Sie für den Vergleich verwenden. Während dies in Ordnung sein, wenn Sie beginnen, verursacht es Probleme schnell zu skalieren.

Ein besserer Weg, dies zu handhaben ist Volltextsuche verwenden. Zwar ist dies eine komplexere Option wäre, wird es Ihnen mit besseren Ergebnissen für sehr große Datenbanken zur Verfügung stellen. Dann können Sie eine funktionierende Version des Beispiels verwenden Bobby Jack hat Ihnen Ihr zwei Ergebnis UNION ALL setzt zusammen und die Ergebnisse anzuzeigen.

Ich würde einen anderen Zusatz vorschlagen

 SELECT "group" type, name
   FROM groups
  WHERE UPPER(name) LIKE UPPER("%$text%")
UNION ALL
 SELECT "user" type, name
   FROM users
  WHERE UPPER(name) LIKE UPPER("%$text%")

Sie können $ Text in Großbuchstaben umwandeln ersten oder tun nur in der Abfrage es. Auf diese Weise erhalten Sie einen Groß- und Kleinschreibung suchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top