2016-08-04 16 views
0

Ich bin für einen effektiven Weg, um die folgenden Suche in MySQL/PHP ...Der beste Weg, um ungefähre Suchabgleich in MySQL/PHP zu gehen?

Stellen Ich habe eine Reihe von Feldern in meiner DB ich tun will auf suchen:

User.username 
Name.first_name 
Address.line1 
Phone.number 
Email.email_address 

I auch haben die folgenden Variablen (mit Beispieldaten) in PHP suchen mit:

$username = "john123"; 
$name = "john"; 
$address = "10 fake street"; 
$phone = "23456789"; 
$email = "[email protected]"; 

Angenommen, es ist 0 vollständige Übereinstimmungen, wie würde ich eine Abfrage schreiben, die teilweise Übereinstimmungen sehen konnten und dann die Ergebnisse nach der Anzahl der bestellten Rückkehr Streichhölzer?

Zum Beispiel meines Beispiels Daten würde ich erwarten könnte ein Ergebnis sehen, so etwas zu sehen,

username | name | address  | phone | email    | matches 
---------------------------------------------------------------------------- 
john123 | john | 12 new street | 23456789 | [email protected] | 4 
tim123 | tim | 10 fake street | 23456789 | [email protected] | 2 

Just zu beachten, ich bin nicht auf der Suche für eine Wildcard-Suche hier. Ich möchte Ergebnisse zurückgeben, die exakte Übereinstimmungen haben, aber nicht unbedingt eine vollständige Übereinstimmung mit allen DB-Feldern. Und möchten auch die Ergebnisse nach der Anzahl der Übereinstimmungen priorisieren.

Ich kann mir eine sehr ineffiziente Art und Weise vorstellen, dies zu tun, indem ich jede als separate Abfrage lade, die in ein PHP-Array geladen wird und dann zähle, welche IDs in den meisten Arrays gefunden werden. Die Datenbank, die dies ausführt, hat jedoch Millionen von Datensätzen pro Tabelle, so dass dies überhaupt nicht möglich wäre.

+0

Ich verwende [boolean Volltextsuche] (http://dev.mysql.com/doc/refman/5.7/en/fulltext-boolean.html) in diesen Szenarien. – haitran

+0

Sie können Ihre Zeichenkette in Zeichen aufteilen und ein Zeichen nach dem anderen mit der Anweisung like in mysql abgleichen. –

Antwort

0
SELECT *, 
    if (username = '$username', 1, 0) + 
    if (name  = '$name' , 1, 0) + 
    if (phone = '$phone' , 1, 0) + 
    if (address = '$address' , 1, 0) AS matches 
FROM tab 
ORDER BY matches DESC 
+0

Danke, das werde ich bestimmt versuchen. Wissen Sie, wie gut sich das skalieren lässt, wenn ich davon ausgehe, dass ich eine vernünftige Grenze für die Abfrage verwende? – user11406