2016-11-01 8 views
0

Ich möchte nach einem Problem fragen, das ich gegenüberstelle.Mysql Suche wie 2 Wörter order

Ich habe den vollständigen Namen in 1 Spalte gespeichert, Beispiel: "John Doe".

Aber auf eine Suche beispielsweise ausführen:

SELECT * FROM client WHERE name LIKE '%Doe John%'; 

Ergebnis: 0 Zeilen.

Wenn ich zum exakten Spielspeicher in der Datenbank wechsel, fand es eine Reihe.

SELECT * FROM client WHERE name LIKE '%John Doe%'; 

Ergebnis: 1 Zeile.

Meine Frage ist, wie man in der Datenbank sucht, ohne die Reihenfolge des Wortes zu nehmen.

In OOP Framework ist der Code:

$like = 'Doe John'; 
$this->db->select('*')->from('client')->like('name', $like)->get(); 

auch getestet ich das, aber ich habe das gleiche Ergebnis:

$this->db->select('*')->from('client'); 
if($this->containTwoWords($like)) { 
    $explode = explode(' ', $like); 
    foreach($explode as $exploded){ 
    $this->db->like('name', $exploded); 
    } 
} else { 
    $this->db->like('name', $like); 
} 
$this->db->get(); 

function containTwoWords($like){ 
    if(strpos($like, ' ') !== false) { 
    return true; 
    } 
    return false; 
} 

Wenn jemand Trog geleitet dieses und hat i schätzen bessere Lösung die gemeinsame Nutzung! .

Antwort

1

Eine Option für Ihren Beispielfall würde für die Vor- und Nachnamen prüfen sein, separat:

SELECT * FROM client WHERE name LIKE '%Doe%' AND name LIKE '%John%' 

Wenn Sie solche Tricks mit dem LIKE Operator erschöpft haben, dann können Sie Volltextsuche in MySQL suchen in Verwendung Fähigkeiten.

+0

Vielen Dank für Ihre Anregung, ist das, was ich in php mit der Explosion Funktion machte die "LIKE '% wie%' AND LIKE '% wie%'" zu erhalten, aber noch kein Ergebnis. ! – ndAR

+0

Erwarten Sie immer eine Eingabe, die 2 Namen enthält? –

0

Versuchen Sie, diese name like '%John%' and name like '%Doe%'

+0

Auf diese Weise ist einfach, aber wie man die 2 Wörter explodieren? – ndAR

0

Wenn Sie die $ wie Variable in Vor-/Nachname explodieren wollen, sind (und Sie erwarten immer zwei Namen, getrennt durch ein Leerzeichen), dann sollte dies für Sie arbeiten.

PHP hat die eingebaute explode() -Methode, die genau das tut, was Sie fragen.

$like = "John Doe"; 
$name = explode(" ", $like); 

// This created a 0-based array, meaning the first item as split 
// by the space between John and Doe is given the array index of 0. 
// $name[0] = John 
// $name[1] = Doe 

So in der Praxis mit MySQL, die wie folgt verwendet werden:

$query = "SELECT * FROM client WHERE name LIKE '%" . $name[0] . "%' AND name LIKE '%" . $name[1] . "%'"; 

Weitere Informationen über die Funktion explode(), besuchen Sie das PHP-Handbuch an: http://php.net/manual/en/function.explode.php

Hoffnung das hilft!

1

versuchen, etwas wie folgt aus:

<?php 
$search_term = 'john doe abc'; 
$keywords = explode(" ", preg_replace("/\s+/", " ", $search_term)); 
foreach($keywords as $keyword){ 
$wherelike[] = " name LIKE '%$keyword%' "; 
} 
$where = implode(" and ", $wherelike); 

$query = "select * from client where $where"; 

echo $query; 
//select * from client where name LIKE '%john%' and name LIKE '%doe%' and name LIKE '%abc%' 

?>