In the last episode (Jan 09), Clyde England said:
> I have a database of names and would like to do a selection based on
> the number or words in a name
> 
> eg the name "Peter Smith" has 2 words
> the name "Peter John Smith" has 3 words
> the name "Peter John Fred Smith" has 4 words
> 
> IE I would like to select all names where there are 3 words in it for
> instance. If there were such a function as words(string) which
> returned the number of words in a string then the simple select
> syntax would be:
> 
> select * from names where words(name) = 3
> 
> Of course in MySql there is no such function (that I am aware of)  -
> so any ideas how I can achieve this result.

Easy (although not all that fast) way:

select * from names where name regexp "^[^ ]*( [^ ]*){2}$";
+------------------+
| name             |
+------------------+
| Peter John Smith |
+------------------+

The '2' in the regex is how many spaces are in the name. 0 = single
word, 1 = 2 words, etc.  Exercise to the reader: make it work correctly
with runs of spaces, and handle tabs and other whitespace characters.

Fast way:

Write a UDF the implements your WORDS() function; this will be quite a
bit faster than the regex.

Fastest way:

Write the UDF, add another column to your table called `words`, index
it, and update it when you update your `name` field.  Use that column
in your queries.

-- 
        Dan Nelson
        [EMAIL PROTECTED]

---------------------------------------------------------------------
Before posting, please check:
   http://www.mysql.com/manual.php   (the manual)
   http://lists.mysql.com/           (the list archive)

To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php

Reply via email to