[This is an email copy of a Usenet post to "mailing.database.mysql"]

How many authors are likely to be passed to this subroutine?  As long as
it is some ``reasonable'' number, I suggest you construct a query using
IN(...).

If you had a *huge* number of authors to check, you might resort to a
JOIN on a temporary table, but I can't see that being faster.  At some
point it might become the only thing that works though, if you had
several MB worth of ("author1", "author2", ... "author234234").   :-)

Anyway, here is how I would do this.

sub existAuthor {
  return() unless ref($_[0]) eq 'ARRAY';  # may as well check
  my $authorNames = $_[0];
  return() unless @{$authorNames};   # make sure there aren't 0 elements

  my $q = "SELECT COUNT(*) AS _count FROM authors WHERE name IN (" .
          join(",", map { $DBH->quote($_) } @{$authorNames}) . ")";
  my $sth = $DBH->prepare($q) or die "DBH->prepare($q): ".$DBH->errstr();
  $sth->execute() or die "sth->execute(): ".$sth->errstr();

  $q = $sth->fetchrow_hashref()->{_count}; # get the result
  $sth->finish();
  return ($q == @{$authorNames});     # return result of comparison
}

Note my use of map { $DBH->quote($_) } to quote the arguments to IN(...).
This, I believe, is the "proper way" to quote text using DBI.  If the
driver provides that method, and mysql does, you can blame it if you have
quoting troubles.  :-)

-- 
Jeff S Wheeler           [EMAIL PROTECTED]
Software Development        Five Elements, Inc
http://www.five-elements.com/~jsw/
database sql query table


In article <[EMAIL PROTECTED]>, "Per M
Knutsen" <[EMAIL PROTECTED]> wrote:

> Can anyone suggest how to convert the following Perl code into a single
> SELECT statement?
> 
> sub existAuthor {
>     my ($authorNames) = @_;     # $authorNames is a reference to an
>     array my ($author, $sqlQuery);    #   containing names of authors
>     foreach $author (@$authorNames) {
>       $sqlQuery = "SELECT * FROM authors WHERE name = '$author'";
>       doQuery($sqlQuery) ? next : return 0;
>     }
>     return 1;
> }
> 
> In words, I want to make sure that every element in the array
> @authorNames exists in the table authors. If not, the routine should
> return false.
> 
> If my array is large, many SQL calls are made with the existing code. Is
> there a way to reduce this to a single SQL statement?
> 
> Thanks!
> 
> Per K


-- 
Jeff S Wheeler           [EMAIL PROTECTED]
Software Development        Five Elements, Inc
http://www.five-elements.com/~jsw/
database sql query table

---------------------------------------------------------------------
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