Link to home
Start Free TrialLog in
Avatar of Lmillard
Lmillard

asked on

MySql select query with multiple LIKE clause not working

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
ASKER CERTIFIED SOLUTION
Avatar of Guy Hengel [angelIII / a3]
Guy Hengel [angelIII / a3]
Flag of Luxembourg image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
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
Avatar of Lmillard
Lmillard

ASKER

Great, thanks very much