2016-08-04 24 views
0

Dies funktioniert;MySQL Volltextsuche Übereinstimmung mit Abfrage UND ODER Spalte1 = ABC

SELECT MATCH('Col1', 'Col2') AGAINST('search query') AS Score, Col1, Col2, Col3 
FROM my_table 
WHERE 
Col1 = 'something-1' 
OR 
Col2 = 'something-2' 
OR 
MATCH('Col1', 'Col2') AGAINST ('search query') HAVING Score > 2; 

Dies nicht;

SELECT MATCH('Col1', 'Col2') AGAINST('search query') AS Score, Col1, Col2, Col3 
FROM my_table 
WHERE 
Col1 = 'something-1' 
OR 
Col2 = 'something-2' 
OR 
MATCH('Col1', 'Col2') AGAINST ('search query') HAVING Score > 2 
AND Col3 = 'something3'; 

Ich bin nicht sicher, dies um die genauen Ergebnisse zeitigt ich noch will zurück, obwohl dies die wichtigste Frage ist: Wie Spiel gegen die mit einer AND, und was am wichtigsten ist, Ketten Dinge zusammen effektiv mit (Klammern zu verwenden,) um die richtige Mischung zu priorisieren;

Von meinen Tests für jede Kombination bisher, habe ich es nicht geschafft, dies effektiv zu arbeiten. Ich versuche, eine aktuelle komplexe Abfrage zu erweitern, die gerade AND und ORs verwendet, um auch MATCH GEGEN Informationen mit einer bestimmten Qualität zu enthalten.

Es muss einen richtigen Weg, dies zu tun, dass ich nicht richtig mache.

Update 1 Interessanterweise, wenn ich die vorgeschlagene Abfrage implementieren und die UND-Anweisung zuerst wie folgt verwenden;

Col3 = 'something3' AND 
(
    Col1 = 'something-1' 
    OR 
    Col2 = 'something-2' 
    OR 
    MATCH('Col1', 'Col2') AGAINST ('search query') > 2 
); 

Dann gibt dies tatsächlich doppelte Ergebnisse zurück.

+0

Wie sollte die Abfrage strukturiert sein? Wenn ich zu der folgenden Abfrage übergehe, erscheint der Fehler Unbekannte Spalte 'Score' in 'WHERE-Klausel': SELECT MATCH ('Col1', 'Col2') GWAINST ('Suchabfrage') AS Score, Col1, Col2, Col3 VON my_table WHERE (Col1 = 'etwas-1' OR Col2 = 'etwas-2' OR Score> 2) UND Col3 = 'something3'; –

+0

Ich nehme es zurück, ich habe deine Aussagen nicht richtig gelesen. Wenn Ihre Anweisung mehrfach Daten zurückgibt, ist das merkwürdig. Wenn Sie ein bisschen erklären können, was Sie wirklich acmaplish möchten, wäre es hilfreich, den ersten Kommentar als irrelevant zu löschen. – Zmrzka

+0

Dieses Bit herausgefunden, wurden die Duplikate verursacht, weil der JOIN ein eindeutiges Feld, nicht das Primärschlüsselfeld http : //stackoverflow.com/questions/6352454/mysql-join-gives-duplicate-rows –

Antwort

1

scheint, dass man einfach

(
    Col1 = 'something-1' 
    OR 
    Col2 = 'something-2' 
    OR 
    MATCH('Col1', 'Col2') AGAINST ('search query') > 2 
) 
AND Col3 = 'something3'; 
+0

Das ist was ich gedacht hätte, obwohl das einen Fehler wirft ....Fehlercode 1064 SQL-Status 42000: Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Server-Version entspricht, um die richtige Syntax in der Nähe von 'HAVING Score> 1) zu verwenden; –

+0

Die Abfrage funktioniert, wenn ich das() um die verschiedenen OR-Bits entferne, und die Abfrage funktioniert auch, wenn ich den "Having Score> 1" -Teil entferne. Obwohl ich beide in –

+0

benötige, brauchst du die having-Klausel nicht, da sie durch die Bedingung ersetzt wird, die sich bereits im OR befindet. – arilia

0

benötigen Der Code von @Arilia vorgesehen funktioniert perfekt. Tipp an mich selbst (und andere, wenn Sie mit einem ähnlichen Problem gestolpert sind) Beachten Sie beim Erstellen komplexer Abfragen immer, dass bei der Berechnung des Ergebnisses, das von MySQL-Volltextsuchen generiert wird, dies nicht für jede Zeile in den Ergebnissen gilt set, einige zeigen 0 an, da sie von diesem Teil der Abfrage nicht ausgelöst wurden, sie wurden von anderen einfacheren Teilen der Abfrage ausgelöst. Schülerfehler.

SELECT MATCH('Col1', 'Col2') AGAINST('search query') AS Score, Col1, Col2, Col3 
FROM my_table 
WHERE 
(
    Col1 = 'something-1' 
    OR 
    Col2 = 'something-2' 
    OR 
    MATCH('Col1', 'Col2') AGAINST ('search query') > 2 
) 
AND 
Col3 = 'something3';