Re: Re: find (matching) person in other table

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 5/30/07, Afan Pasalic <afan@xxxxxxxx> wrote:

yes. in one hand it's more for mysql list. though, I was thinking more
if somebody had already something similar as a "project". more as path I
have to follow.
e.g., in your example, in where  clause AND doesn't work because bob
could be robert too, right? and last name has to match 100%, right? (or
I'm wrong?)


You're right. Remember, that was an example of what you MIGHT do, not
necessarily what you SHOULD do.

You could also situationally check the returned fields and if it's greater
than, say, 25 or 50, re-run the query and change the letters matched to 4,
for instance, and then add a link to get the greater total.

You could also look at the "search box suggestion" code that's out there for
a way to implement this on the server side. Don't know if that code will be
optimized or not, but that's essentially what you're doing here.

how "smart" solution will be something like this:

$query = my_query("select id from members where last_name='$last_name'");
while($result = mysql_fetch_array($query))
{
    $MEMBERS[$result['id']] += 50;
}


Well, see, if the match isn't exact, it won't return anything. Unless you
know the exact name.

You also may have to deal with someone misstyping their name(s).

$query = my_query("select id from members where first_name='$first_name'");
while($result = mysql_fetch_array($query))
{
    $MEMBERS[$result['id']] += 10;
}

$query = my_query("select id from members where email='$email'");
while($result = mysql_fetch_array($query))
{
    $MEMBERS[$result['id']] += 85;
}


Why would you do that many SELECTs? (Also, if you cap the SQL commands, it's
easier to read.)

etc.

after last query I will have an array of people. and I'll list all
person with "score" more than 50.


This is a really roundabout way to do this. Look at the Levinshtein PHP
manual page for some suggestions on how to calculate similarities. I *think*
that should be better to do this:

for ($i = 0; $i < count($mysqlresultset); $i++) {
   $lev = levenshtein($mysqlresultset[$i][$firstname], $postedname);
   if ($lev > 49) {
       $matches[] = $mysqlresultset[$i];
   }
}

or, since last name MUST match, I think it's better this way (just got
in my head):
$query = my_query("select id from members where last_name='$last_name'");
while($result = mysql_fetch_array($query))
{
    $query = my_query("select id from members where
first_name='$first_name'");
    while($result = mysql_fetch_array($query))
    {
        $MEMBERS[$result['id']] += 10;
    }

    $query = my_query("select id from members where email='$email'");
    while($result = mysql_fetch_array($query))
    {
        $MEMBERS[$result['id']] += 85;
    }

    etc.
}


There's a lot of unnecessary work you're making PHP and your database do.
This is quite inefficient code.

If you're trying to match the emails and whatnot, then combine all those
queries together. SELECT them all together. It looks like what you're doing
is weighting it by email address, which you can add to the SELECT I posted
(although you need to think about how you use your wildcards for email
addresses, such as maybe matching the beginning OR the end, for instance).
It's even better if the person has to activate the account with an email
link to activate, since then you'd know the email address existed (although
it doesn't mean it isn't someone in the database that isn't already in
there).

--
Jared Farrish
Intermediate Web Developer
Denton, Tx

Abraham Maslow: "If the only tool you have is a hammer, you tend to see
every problem as a nail." $$

[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux