Solved

Mysql Search for contact

Posted on 2014-12-27
6
239 Views
Last Modified: 2015-05-19
I am trying to find the best way to create a global search of contacts. To have one search box and search within multiple fields at once. Im using mysql with InnoDB engine.

$wherestm = "
WHERE (people.peopleFirstName LIKE {$search1}%) OR
      (people.peopleLastName LIKE {$search1}%) OR
      (company LIKE {$search1}%) OR
        (people.peopleTel LIKE {$search1}%) OR
        (people.peopleEmail LIKE {$search1}%)";
}
$sql =
"
SELECT
people.peopleId,
people.peopleFirstName,
people.peopleLastName,
people.peopleCompanyId,
company.companyName As company,
people.peopleTel,
people.peopleCel,
people.peopleEmail
FROM
people
LEFT JOIN company ON people.peopleCompanyId = company.companyId
{$wherestm}
0
Comment
Question by:ido90
6 Comments
 
LVL 109

Expert Comment

by:Ray Paseur
ID: 40519951
That approach seems reasonable.  It may not be syntactically exact, but it appears to be conceptually sound.  How many rows are in the people table?  Which columns are indexed?
0
 

Author Comment

by:ido90
ID: 40519961
Its a large data set, 30k of data. I have indexed Id, PeopleFirstName, PeopleLastName, peopleTel and peopleEmail. The issue Im running into with this approach is that for some reason Im getting results which have nothing todo with the search term.
0
 
LVL 109

Expert Comment

by:Ray Paseur
ID: 40519971
My initial guess is that this might be the culprit:

 (company LIKE {$search1}%) OR ...

However when you search for:

(people.peopleTel LIKE {$search1}%) OR
(people.peopleEmail LIKE {$search1}%)

if the $search1 value is NULL or very short, you may get a lot of results that are unwanted.

To understand this better it would be helpful if you can post some sample data - a few rows from the data set that reflect both the wanted and unwanted results.  Then we can work to refine the query so that unwanted results are not returned.  Let the SSCCE be your guide.
0
Webinar: Aligning, Automating, Winning

Join Dan Russo, Senior Manager of Operations Intelligence, for an in-depth discussion on how Dealertrack, leading provider of integrated digital solutions for the automotive industry, transformed their DevOps processes to increase collaboration and move with greater velocity.

 
LVL 58

Accepted Solution

by:
Gary earned 500 total points
ID: 40520069
Where you have a multi column search with variable input then you are always going to have rows returned that are not what is being looked for.


Instead of some random global search why not have a radio button field to select what you want to search by - people id, first name, company name etc.


Would make your sql significantly smaller and more on point as to what peple are searching by - even Google has various options to narrow your search by what you really want.


This is a common practice - it certainly isn't expected that you enter a search term and the whole database is searched - it puts unnecessary strain on the db.


You could even narrow it down to just ID, name, phone or email


Doesn't need to be unneccesarily complicated for the user to select the correct criteria to search by
0
 
LVL 29

Expert Comment

by:Olaf Doschke
ID: 40520728
I don't know why you tagged this as Foxpro database, maybe just in error, but nevertheless I also do some PHP/mysql.

peopleFirstName LIKE {$search1}%
If $search1 would be 'Ray' that would be substituted as in
peopleFirstName LIKE Ray%

Open in new window

Which is wrong syntax, you need
peopleFirstName LIKE 'Ray%'

Open in new window


Maybe my MySQL is rusted and this works, but I'm quite sure you only can make a more generic approach with parametrization with the questionmark, see mysqli_stmt_bind_param - http://php.net/manual/de/mysqli-stmt.bind-param.php, you'd write the query parameterized with
peopleFirstName LIKE ?+'%'

Open in new window

And more such parameters and bind the $search1 variable multiple times.
Or you add the % to the variable value and simplify the sql to clauses using LIKE ? and let your frontend application make the decision, whether to add % to the user input or not. For example % doesn't work at all for numeric fields, as LIKE only is a string comparison operator.

Bye, Olaf.
0
 
LVL 27

Expert Comment

by:CaptainCyril
ID: 40616940
I would check to see if the input has alphanumeric characters. If it does then exclude telephone and if it does not then search telephone columns and exclude names. It will impact performance.
0

Featured Post

Windows Server 2016: All you need to know

Learn about Hyper-V features that increase functionality and usability of Microsoft Windows Server 2016. Also, throughout this eBook, you’ll find some basic PowerShell examples that will help you leverage the scripts in your environments!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Things That Drive Us Nuts Have you noticed the use of the reCaptcha feature at EE and other web sites?  It wants you to read and retype something that looks like this.Insanity!  It's not EE's fault - that's just the way reCaptcha works.  But it is …
When table data gets too large to manage or queries take too long to execute the solution is often to buy bigger hardware or assign more CPUs and memory resources to the machine to solve the problem. However, the best, cheapest and most effective so…
Learn how to match and substitute tagged data using PHP regular expressions. Demonstrated on Windows 7, but also applies to other operating systems. Demonstrated technique applies to PHP (all versions) and Firefox, but very similar techniques will w…
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…

828 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question