Solved

MySql select query with multiple LIKE clause not working

Posted on 2010-08-26
3
347 Views
Last Modified: 2012-05-10
Hi,

I have the following MySql statement that is generated by a script based upon the input from the user.
If the user enters more than one term like in this case 'glass plates' I want it to locate all products where the product code or description is LIKE glass OR plates.
This is fine but slightly more complicated by the additional AND clauses which end up with the malformed query below. I have tried a few alternatives but this query result needs to be paginated and they did not seem to work.

SELECT ProdHead.ProdCode, ProdHead.ProdDesc, ProdSku.Colour  
FROM ProdHead
INNER JOIN ProdSku ON ProdHead.ProdCode = ProdSku.ProdCode
INNER JOIN ProdTitleIndex ON ProdHead.ProdCode = ProdTitleIndex.ProdCode
WHERE Concat(ProdHead.ProdDesc,Prodhead.prodcode) LIKE '%glass%'
OR Concat(ProdHead.ProdDesc,Prodhead.prodcode) LIKE '%plates%'
AND ProdHead.Avail = 1
AND ProdSku.Avail = 1
AND ProdHead.SubGroup > 0
AND ProdHead.SubGroup = 228
ORDER BY ProdHead.ProdDesc
LIMIT 0, 10

The only way I can get this to work is by repeating the AND clauses after each OR cluase which is just silly so I was hoping there may be a way of doing something such as

WHERE ........ IN('%glass%','%plates%')


Any help appreciated.

Regards
Leigh
0
Comment
Question by:Lmillard
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
3 Comments
 
LVL 143

Accepted Solution

by:
Guy Hengel [angelIII / a3] earned 500 total points
ID: 33529809
>WHERE ........ IN('%glass%','%plates%')

sorry, won't work, unfortunately ...

apart from that: you mix AND an OR, so you need ()
SELECT ProdHead.ProdCode, ProdHead.ProdDesc, ProdSku.Colour  
FROM ProdHead
INNER JOIN ProdSku ON ProdHead.ProdCode = ProdSku.ProdCode
INNER JOIN ProdTitleIndex ON ProdHead.ProdCode = ProdTitleIndex.ProdCode
WHERE ( Concat(ProdHead.ProdDesc,Prodhead.prodcode) LIKE '%glass%'
     OR Concat(ProdHead.ProdDesc,Prodhead.prodcode) LIKE '%plates%'
      )
AND ProdHead.Avail = 1
AND ProdSku.Avail = 1
AND ProdHead.SubGroup > 0
AND ProdHead.SubGroup = 228
ORDER BY ProdHead.ProdDesc
LIMIT 0, 10 

Open in new window

0
 
LVL 58

Expert Comment

by:cyberkiwi
ID: 33529829
You need to properly bracket the LIKE's

SELECT ProdHead.ProdCode, ProdHead.ProdDesc, ProdSku.Colour  
FROM ProdHead
INNER JOIN ProdSku ON ProdHead.ProdCode = ProdSku.ProdCode
INNER JOIN ProdTitleIndex ON ProdHead.ProdCode = ProdTitleIndex.ProdCode
WHERE
(     Concat(ProdHead.ProdDesc,Prodhead.prodcode) LIKE '%glass%'
      OR Concat(ProdHead.ProdDesc,Prodhead.prodcode) LIKE '%plates%' )
AND ProdHead.Avail = 1
AND ProdSku.Avail = 1
AND ProdHead.SubGroup > 0
AND ProdHead.SubGroup = 228
ORDER BY ProdHead.ProdDesc
LIMIT 0, 10

The IN form doesn't work, IN only takes exact matches.
Though the query above will work, to perform decently, you may want to try splitting it out and timing each alternative.

SELECT ProdHead.ProdCode, ProdHead.ProdDesc, ProdSku.Colour  
FROM ProdHead
INNER JOIN ProdSku ON ProdHead.ProdCode = ProdSku.ProdCode
INNER JOIN ProdTitleIndex ON ProdHead.ProdCode = ProdTitleIndex.ProdCode
WHERE
(     ProdHead.ProdDesc LIKE '%glass%' OR
      Prodhead.prodcode LIKE '%glass%' OR
      ProdHead.ProdDesc LIKE '%plates%' OR
      Prodhead.prodcode LIKE '%plates%')
AND ProdHead.Avail = 1
AND ProdSku.Avail = 1
AND ProdHead.SubGroup > 0
AND ProdHead.SubGroup = 228
ORDER BY ProdHead.ProdDesc
LIMIT 0, 10
0
 

Author Closing Comment

by:Lmillard
ID: 33530049
Great, thanks very much
0

Featured Post

Optimize your web performance

What's in the eBook?
- Full list of reasons for poor performance
- Ultimate measures to speed things up
- Primary web monitoring types
- KPIs you should be monitoring in order to increase your ROI

Question has a verified solution.

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

Composite queries are used to retrieve the results from joining multiple queries after applying any filters. UNION, INTERSECT, MINUS, and UNION ALL are some of the operators used to get certain desired results.​
Creating and Managing Databases with phpMyAdmin in cPanel.
Monitoring a network: why having a policy is the best policy? Michael Kulchisky, MCSE, MCSA, MCP, VTSP, VSP, CCSP outlines the enormous benefits of having a policy-based approach when monitoring medium and large networks. Software utilized in this v…
In this video you will find out how to export Office 365 mailboxes using the built in eDiscovery tool. Bear in mind that although this method might be useful in some cases, using PST files as Office 365 backup is troublesome in a long run (more on t…

615 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