2 Stimmen

SQL-Text-Suche, AND-Bestellung

Ich habe eine Frage:

SELECT *
FROM Items
WHERE column LIKE '%foo%'
   OR column LIKE '%bar%'

Wie kann ich die Ergebnisse bestellen?

Angenommen, ich habe Zeilen, die mit "foo" übereinstimmen, und Zeilen, die mit "bar" übereinstimmen, aber ich habe auch eine Zeile mit "foobar".

Wie ordne ich die zurückgegebenen Zeilen so an, dass die ersten Ergebnisse diejenigen sind, die mehr LIKEs gefunden haben?

4voto

Vinko Vrsalovic Punkte 252104

Case oder die Art des bedingten Konstrukts, das Ihr RDBMS unterstützt, ist eine Möglichkeit, dies zu tun

select *, case when col like '%foo%' and col like '%bar%' then 2 end 
else 1 end as ordcol 
from items 
where col like '%foo%' or col like '%bar%' order by ordcol

2voto

nicudotro Punkte 6891
SELECT * FROM Items WHERE column LIKE '%foo%' OR column LIKE '%bar%' 
ORDER BY 
(IF(column LIKE '%foo%',1,0) + IF(column LIKE '%bar%',1,0)) 
DESC

Die Syntax für if lautet

IF ( condition, true_value, false_value )

1voto

Thomas Punkte 160390

Sie könnten eine UNION :

SELECT * FROM Items WHERE column LIKE '%foo%' AND column LIKE '%bar%'
UNION
SELECT * FROM Items WHERE column LIKE '%foo%' AND NOT (column LIKE '%bar%')
UNION
SELECT * FROM Items WHERE column LIKE '%bar%' AND NOT (column LIKE '%foo%');

Aber das kann sich negativ auf die Leistung auswirken. Schlimmer noch, ich vermute, dass Sie damit eine Suchmaschine aufbauen wollen, die zuerst die aussagekräftigsten Ergebnisse liefert, und dann bleibt die Anzahl der Wörter nicht auf 2 begrenzt.

In diesem Fall könnten Sie eine score Spalte, die die Anzahl der Treffer enthält. Etwa so:

SELECT
    *,
    (IF(column LIKE '%bar%', 1, 0) + IF(column LIKE '%foo%', 1, 0)) AS score
FROM Items
WHERE column LIKE '%foo%' OR column LIKE '%bar%'
ORDER BY score DESC;

Mein SQL ist ein wenig eingerostet, aber so etwas sollte zumindest in MySQL 5.0 möglich sein. Siehe auch das Handbuch für die IF Funktion: http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html

1voto

Andy Irving Punkte 2597
SELECT * FROM Items
WHERE col LIKE '%foo%'
    OR col LIKE '%bar%'
ORDER BY CASE WHEN col LIKE '%foo%' THEN 1
                WHEN col LIKE '%bar%' THEN 2
            END

0voto

Milan Babuškov Punkte 57324

Welches DBMS?

Dies kann z. B. über CTE oder Union geschehen, aber wenn Sie z. B. MySQL verwenden, können Sie es vergessen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X