Re: ForEach Range Problems
| From: | Andrew Ballard | Date: | Sat, 01 Aug 2009 06:20:31 +0000 |
| Subject: | Re: ForEach Range Problems | ||
| References: | 1 2 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-296158@lists.php.net to get a copy of this message | ||
On Fri, Jul 31, 2009 at 4:51 PM, Miller,
Terion<tmiller@springfi.gannett.com> wrote:
> //Show all restaurants that start with $letter not
> between "A" and "Z"
>
> $other = ctype_digit($letter);
>
> foreach(range('0','9') as $other) {
>
> $sql = "SELECT DISTINCT ID, name, address
> FROM restaurants
> WHERE name LIKE '{$other}%' ";
>
> $result = mysql_query($sql) or die(mysql_error());
>
> while($row = mysql_fetch_assoc($result)){
>
> $name = $row['name'];
>
> printf(
> '<a href="view.php?ID=%s"><b>%s</b><br
> />%s'
> . '<br /><br /></a>',
> $row['ID'],
> $row['name'],
> $row['address']
> );
> }
> }
Why are you running 10 individual queries to search for restaurants
whose name begins with a number?
There are (at least) two simple, sargable alternatives available that
will work in MySQL to do the work in one shot:
SELECT DISTINCT ID, name, address
FROM restaurants
WHERE name LIKE '0%'
OR name LIKE '1%'
OR name LIKE '2%'
OR name LIKE '3%'
OR name LIKE '4%'
OR name LIKE '5%'
OR name LIKE '6%'
OR name LIKE '7%'
OR name LIKE '8%'
OR name LIKE '9%'
(It can use an index on the
name column and it works, but it's
pretty verbose. Performance might suffer a little if it involves a
table scan because of the OR's, but I'm not sure about that.)
SELECT DISTINCT ID, name, address
FROM restaurants
WHERE name >= '0' AND name < 'A';
(Its a lot shorter because it takes advantage of string collation. Any
string that begins with the character '0' will be greater than (or
equal if the string is exactly '0') than '0'.)
Also, if your table is set up correctly, you do not need the DISTINCT
keyword in your query. Each restaurant should appear exactly once in
the restaurants table.
And just for fun... do you have any restaurants in your list whose
name begins with a punctuation mark or some other non-alphanumeric
character? :-)
Andrew