verbindung - php mysqli




Verwenden Sie mysql concat() in der WHERE-Klausel? (5)

Beachten Sie, dass bei der Suchabfrage Groß- und Kleinschreibung beachtet wird.

Beim Benutzen

SELECT * FROM table WHERE `first_name` LIKE '%$search_term%'

Es wird sowohl "Larry" als auch "Larry" passen. Mit diesem concat_ws wird es plötzlich case sensitive!

Dies kann mithilfe der folgenden Abfrage behoben werden:

SELECT * FROM table WHERE UPPER(CONCAT_WS(' ', `first_name`, `last_name`) LIKE UPPER('%$search_term%')

Bearbeiten: Beachten Sie, dass dies nur für nicht binäre Elemente funktioniert. Siehe auch die Antwort von mynameispaulie .

Ich möchte meine Tabelle mit einer Vornamenspalte und einer Nachnamenspalte durchsuchen. Ich akzeptiere derzeit einen Suchbegriff aus einem Feld und vergleiche ihn mit beiden Spalten.

    select * from table where first_name like '%$search_term%' or 
    last_name like '%$search_term%';

Dies funktioniert gut mit Einzelwort-Suchbegriffen, aber die Ergebnismenge enthält alle mit dem Namen "Larry". Aber wenn jemand einen Vornamen, dann ein Leerzeichen, dann einen Nachnamen eingibt, dann möchte ich ein schmaleres Suchergebnis. Ich habe folgendes ohne Erfolg ausprobiert.

    select * from table where first_name like '%$search_term%' or last_name 
    like '%$search_term%' or concat_ws(' ',first_name,last_name) 
    like '%$search_term%';

Irgendein Rat?

EDIT: Der Name, mit dem ich teste, ist "Larry Smith". Die Datenbank speichert "Larry" in der Spalte "first_name" und "Smith" in der Spalte "last_name". Die Daten sind sauber, keine zusätzlichen Leerzeichen und der Suchbegriff wird links und rechts getrimmt.

EDIT 2: Ich habe heute morgen die Antwort von Robert Gamble ausprobiert. Seine ist sehr ähnlich zu dem, was ich letzte Nacht ausgeführt habe. Ich kann es nicht erklären, aber heute morgen funktioniert es. Der einzige Unterschied, den ich mir vorstellen kann, ist, dass ich letzte Nacht die concat-Funktion als drittes "oder" -Segment meiner Suchabfrage ausgeführt habe (nachdem ich Vorname und Nachname durchsucht habe). Heute Morgen habe ich es als letztes Segment laufen lassen, nachdem ich die oben genannten Adressen und Firmennamen durchgesehen habe.

Läuft eine mysql-Funktion am Ende einer Abfrage besser als in der Mitte?


Es gibt ein paar Dinge, die Ihnen in die Quere kommen könnten - sind Ihre Daten sauber?

Es könnte sein, dass Sie am Ende des Vornamensfelds Leerzeichen haben, was bedeutet, dass Sie zwei Leerzeichen zwischen dem Vornamen und dem Nachnamen haben, wenn Sie sie verbergen? Mit trim (first_name) / trim (last_name) wird dies behoben - obwohl die eigentliche Lösung darin besteht, Ihre Daten zu aktualisieren.

Du könntest auch das anpassen, wo zwei Wörter auftreten, aber nicht notwendigerweise zusammen (vorausgesetzt du bist in php - was die Variable $ search_term vorschlägt)

$whereclauses=array();
$terms = explode(' ', $search_term);
foreach ($terms as $term) {
    $term = mysql_real_escape_string($term);
    $whereclauses[] = "CONCAT(first_name, ' ', last_name) LIKE '%$term%'";
}
$sql = "select * from table where";
$sql .= implode(' and ', $whereclauses);

Sie können dies versuchen:

select * FROM table where (concat(first_name, ' ', last_name)) = $search_term;

Was Sie haben sollte funktionieren, kann aber reduziert werden auf:

select * from table where concat_ws(' ',first_name,last_name) 
like '%$search_term%';

Können Sie einen Beispielnamen und einen Suchbegriff angeben, wo dies nicht funktioniert?


SELECT *,concat_ws(' ',first_name,last_name) AS whole_name FROM users HAVING whole_name LIKE '%$search_term%'

... ist wahrscheinlich was du willst.





mysql