Ich möchte eine Suchfunktion in meiner Anwendung für die Daten wie folgt
%Vor% Wenn ich nun nach dem Begriff cricket AND football
o / p suche, sollte
und wenn ich nach dem Begriff cricket OR football
o / p suche, sollte
Ich versuche etwas wie folgt
FÜR UND
%Vor%FÜR ODER
%Vor% Mein Problem ist, wenn die Suche nach der cricket AND football AND basketball AND chess
Abfrage sehr pathetisch wird
Gibt es dafür eine einfache Lösung? Ich habe auch für GROUP_CONCAT versucht, aber vergebens
UPDATE:
Diese Aufgabe kann einfach mit RDBMS gelöst werden, die alle Operationen des Sets unterstützt: UNION , INTERSECT und EXCEPT (oder MINUS )
Dann irgendwelche Bedingungen wie:
kann leicht in:
umgewandelt werden %Vor%Das eigentliche Problem, dass MYSQL INTERSECT nicht unterstützt, sollte wie oben gezeigt emuliert werden. Das zweite Problem besteht darin, Klammern und Operatorvorgaben zu beachten.
Also mögliche Lösung ohne Klammern in Ausdrücken zu verwenden:
Sammeln Sie alle Tags, die durch AND-Bedingungen verbunden sind, und erstellen Sie eine Abfrage als erstes Beispiel in Antwort.
Fügen Sie alle Tags hinzu, die OR-Bedingung verknüpft haben (kann IN oder UNION verwendet werden), und verwenden Sie das UNION-Kombinationsresultat.
Ein anderer Ansatz ist nur möglich, wenn die Anzahl der Tags weniger als 64 ist. Dann hat jedes Tag ein eigenes Bit (Sie müssen Bigint-Felder 'Tags' in die Topics-Tabelle einfügen, wo Tags im Binärformat dargestellt werden) und mysql-Bitoperationen verwenden Abfrage erstellen.
Großer Nachteil, dass diese Lösung nur für 64 Tags limitiert ist.
a UND b UND c UND d:
%Vor%Leider ist der OR-Zustand schwieriger. Full Outer Join wäre praktisch, aber MySQL fehlt diese Funktion.
Ich schlage vor, dass Sie keine ORs in Klammern haben (nicht (a OR b) AND c
, sondern (a AND c) OR (b AND c)
und eine solche Abfrage ausführen:
a ODER b ODER c OR (einige und Klausel wie d UND e):
%Vor%In der db-Software außer MySQL könnten Sie die Abfrage wahrscheinlich verwenden (ich habe momentan keine Möglichkeit, es zu testen), wie diese:
%Vor% was ich glaube, sollte (a UND b) ODER (c UND d) darstellen. Hinweis COALESCE
, wegen der vollständigen äußeren Verknüpfung t1.topic_id könnte null sein.
Dies ist eine Rails-Lösung, die selbstreferenzierende Joins für den Fall AND
und ein einfaches SQL-Include für den Fall OR
erstellt. Die Lösung geht von einem Modell mit dem Namen TopicTag und folglich von einer Tabelle namens topic_tags aus.
Die Klassenmethode Search erwartet 2 Argumente ein Array von Tags und eine Zeichenfolge, die entweder "and" oder "or"
enthält %Vor%Um mehr Testabdeckung zu erhalten, wurden die Daten erweitert, um eine zusätzliche Aufzeichnung für Schach zu enthalten. Die Datenbank wurde mit dem folgenden Code gesetzt:
%Vor%Der folgende Testcode ergab die gezeigten Ergebnisse
%Vor% %Vor%Getestet auf Rails 2.3.8 mit SqlLite
BEARBEITEN
Wenn Sie "Gefällt mir" verwenden möchten, wird auch der Fall OR
etwas komplexer. Sie sollten sich darüber im Klaren sein, dass die Verwendung von LIKE mit einem führenden '%' erhebliche Auswirkungen auf die Leistung haben kann, wenn die von Ihnen gesuchte Tabelle eine nicht-triviale Größe hat.
Die folgende Version des Modells verwendet LIKE für beide Fälle.
%Vor% %Vor%Tags und Links sql mysql ruby-on-rails