Abfrage, um abhängig vom Tag nach Themen zu suchen

8

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

sein %Vor%

und wenn ich nach dem Begriff cricket OR football o / p suche, sollte

sein %Vor%

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

    
Salil 30.07.2010, 06:43
quelle

4 Antworten

4
%Vor%

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:

  1. (Tag1 UND Tag2) ODER Tag3 NICHT Tag4
  2. Tag1 oder Tag2
  3. Tag1 UND Tag2 und Tag3
  4. (Tag1 UND Tag2) ODER (Tag3 UND Tag4)

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:

  1. Sammeln Sie alle Tags, die durch AND-Bedingungen verbunden sind, und erstellen Sie eine Abfrage als erstes Beispiel in Antwort.

  2. 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.

    
Michael Pakhantsov 30.07.2010 06:56
quelle
1

Sie müssen einen Self-Join durchführen

%Vor%     
bradgonesurfing 30.07.2010 06:51
quelle
0

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.

    
skalee 05.08.2010 14:09
quelle
0

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%     
Steve Weet 10.08.2010 14:04
quelle

Tags und Links