2012-02-01 14 views

Odpowiedz

71

Dobrze jeśli znasz kolejność słów .. można użyć:

SELECT `name` FROM `table` WHERE `name` REGEXP 'Stylus.+2100' 

Ponadto można użyć:

SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus%' AND `name` LIKE '%2100%' 
+0

Dzięki, nie otrzymam "HP Laserjet 2100". Przepraszam, jeśli mój przykład nie był najlepszy. –

+1

Jeden z odpowiedzi na odpowiedź tutaj porównał wydajność LIKE/REGEX i stwierdził, że LIKE działał lepiej, FYI: http://stackoverflow.com/questions/1127088/mysql-like-in – Amalgovinus

+0

@Amalgovinus dzięki za link, nie chciałbym Tak myślałeś ... Dobrze wiedzieć :) – SERPRO

17

można po prostu zastąpić każdą przestrzeń %

SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus%2100%' 
+0

Dzięki, ale w ten sposób nie dostałbym, gdybym szukał "Photo Stylus 2100" –

+0

haha! ok, to wymaganie nie zostało określone w pytaniu "Jak mogę wybrać rekord, wyszukując" Stylus 2100 "?" –

+0

masz rację! Moja wina, przepraszam! W każdym razie dziękuję –

26

Myślę, że najlepszym rozwiązaniem byłoby użyć wyrażeń regularnych. Jest najczystszy i prawdopodobnie najskuteczniejszy. Wyrażenia regularne są obsługiwane we wszystkich powszechnie używanych silnikach baz danych.

w MySQL jest RLIKE operator więc zapytanie byłoby coś takiego:
SELECT * FROM buckets WHERE bucketname RLIKE 'Stylus|2100'
Nie jestem zbyt mocny w regexp więc mam nadzieję, że wyrażenie jest w porządku.

Edit
RegExp powinno być raczej:

SELECT * FROM buckets WHERE bucketname RLIKE '(?=.*Stylus)(?=.*2100)' 

Więcej na MySQL wsparcia regexp:
http://dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp

+0

To wyrażenie regularne robi coś innego: pobiera wszystko, co zawiera _either_ 'Stylus' lub '2100', niekoniecznie oba. –

+0

Poprawiłem mój RegExp –

+1

Szukałem rozwiązania tylko w regexp i ta sztuczka zrobiła to ^^, – velop

1

Prawidłowe rozwiązanie jest pełnotekstowego wyszukiwania (jeśli można go używać) https://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html

To prawie robi to, co chcesz:

SELECT * FROM buckets WHERE bucketname RLIKE '(Stylus|2100)+.*(Stylus|2100)+'; 

SELECT * FROM buckets WHERE bucketname RLIKE '(Stylus|2100|photo)+.*(Stylus|2100|photo)+.*(Stylus|2100|photo)+.*'; 

Ale to również będzie pasowało do "210021002100", co nie jest świetne.

Powiązane problemy