2016-06-07 4 views
0

Abfrage entsprechen.mysql und wie Anweisung ein volles Wort zu einer

name 
'bob a joe' 
'ana l lee' 
'bobby joel' 

Ich mag würde NUR Rückkehr bob joe, NICHT bobby joel:

SELECT name FROM people 
WHERE name Like '%bob%' 
AND name like '%joe%'; 

Dieser Code gibt sowohl den Bob und bobby Namen. Die Namen in meiner Datenbank sind nicht immer die Ersten, sie sind manchmal die Ersten in der Mitte, also behebt 'bob%' das Problem nicht. Es stimmt, dass

SELECT name FROM people 
WHERE name LIKE '%bob %' OR name LIKE '% bob%' 
AND name LIKE '%joe %' OR name LIKE '% joe%' 

dieses Problem lösen würde, aber ich bin für eine möglicherweise einfache oder bessere Lösung

Vielen Dank Will

+1

wie etwa 2 Spalten, Vorname und Nachname in Ihrer Datenbank? :) – Medda86

+0

'Wo trimmen (name) wie 'bob%' und trimmen (name) wie '% joe'' wollen nicht die Prozent am Anfang oder am Ende. Will nur 2% 's Obwohl das ist sehr hackish als Bobby Joe würde zurückgegeben werden. Die einzige Möglichkeit, dies zu tun, ist die Suche nach dem ersten Raum von links und dem ersten Raum von irght als Vor- und Nachnamen und dann nur mit diesen. – xQbert

Antwort

0

suche Wenn Sie nur verwenden mögen like zu finden vollständige Wörter in einer bestimmten Reihenfolge, Sie müssen alle 3 Variationen aufschreiben, weil es keine Flagge für start of a word in like gibt. Sie müssen also

SELECT name FROM people 
WHERE (name LIKE 'bob %' OR name LIKE '% bob %' or name LIKE '% bob') 
    and (name LIKE 'joe %' OR name LIKE '% joe %' or name LIKE '% joe'); 

aufschreiben, um alle Möglichkeiten abzudecken (Anfang, Mitte und Ende).

Eine weitere (schnelle) Möglichkeit (abgesehen von der Aufspaltung der Namen in separate Spalten), um vollständige Wörter zu finden, ist die Verwendung eines fulltext search. Der Volltextindex ermöglicht es Ihnen, nach ganzen Wörtern zu suchen, deren Länge mindestens innodb_ft_min_token_size (für InnoDB) und ft_min_word_len (für MyISAM) ist. Sie können diese Optionen in Ihrer Konfigurationsdatei festlegen. Der Standardwert ist 3 für innodb und 4 für myisam, also wäre 'joe' auf innodb in Ordnung. (Eine andere Sache, die man beachten sollte: Es gibt eine Stopword - Tabelle mit sehr sehr häufigen englischen Wörtern, die nicht im Index enthalten sind, wie 'sind' oder 'für' (der Volltextindex wird normalerweise verwendet, um ganze Sätze zu indizieren) nur Namen.) Sie können diese Tabelle ändern, indem Sie stopwords options setzen.

Fügen Sie einen Volltextindex für Ihre name -Spalte hinzu (wenn Sie die Optionen ändern, müssen Sie den Index neu erstellen).

create fulltext index idx_ft_people_name on people (name); 

und dann match against verwenden die Worte

select * from people 
where match(`name`) against ('+joe +bob' in boolean mode); 
0

Große Antwort Solarflare zu finden. Ich mag Ihre Syntax auf dieser Anweisung sehr viel mehr als die Art, wie ich es hatte, und das ist einfach in eine for-Schleife durch meinen Manipulator zu bauen, der Matlab ist.

Diese andere Route sieht aus technischer Sicht schwierig aus, aber wenn ich eine große Zeitverzögerung in der ersten Strategie sehe, werde ich darauf zurückgreifen.

Schätzen Sie die Hilfe, Will

Verwandte Themen