tags:

views:

47

answers:

2

I'm dealing with a bit of a legacy database here, and I'm having some trouble with writing a search query.

The two tables concerned are products and tours (multiple per product).

My general query looks like this:

SELECT products.*, tours.* FROM products INNER JOIN tours 
ON products.id=tours.product_id
GROUP BY products.id

Now here's the part where I'm having trouble. The products table contains a column, countries, which is a pipe-seperated list of country id's, like so: 13|45|33|29|133|337. I need to return a list of products that have, for example, country 33.

For simplicity, I could do where products.countries LIKE '%33%', but this would return 133 and 337 as well. I'll need to use where products.countries LIKE '%|33|%', but this won't match them if they're first or last. Therefore, I need to append a pipe to either end of the column value when selecting, which leaves me with something like:

SELECT products.*, tours.*, CONCAT("|",products.countries,"|") AS country_list
FROM products INNER JOIN tours ON products.id=tours.product_id
GROUP BY products.id

But if I attempt to add WHERE country_list LIKE '|%33%|', I get an "undefined index: country_list" error..

What am I doing wrong here?

+3  A: 

You can use:

WHERE CONCAT("|",products.countries,"|") LIKE '%|33|%'

note that the pipes are within the percent signs

Scott Saunders
Just so I understand, you can't reference the alias in the WHERE clause, can you?
MJB
Great, that works. Any explanation for the error, and why I can't select it?
Jeriko
+1  A: 

Aliases are not availible in WHERE clauses. Just in HAVING clauses

"An alias can be used in a query select list to give a column a different name. You can use the alias in GROUP BY, ORDER BY, or HAVING clauses to refer to the column" 1

So you can either do

HAVING country_list LIKE '|%33%|'

Or the satement without Aliases, that Scott posted.

JochenJung
Thanks. I Used Scott's solution, but I'm accepting this one because I think it answers the question best.
Jeriko