我在这里处理一些遗留数据库,我在编写搜索查询时遇到了一些麻烦。
有关的两个表格为products
和tours
(每个产品多个)。
我的一般查询如下:
SELECT products.*, tours.* FROM products INNER JOIN tours
ON products.id=tours.product_id
GROUP BY products.id
现在这里是我遇到麻烦的部分。 products
表包含一列countries
,它是国家/地区ID的管道分隔列表,如下所示:13|45|33|29|133|337
。我需要返回一个products
列表,例如国家/地区33
。
为简单起见,我可以where products.countries LIKE '%33%'
,但这也会返回133
和337
。我需要使用where products.countries LIKE '%|33|%'
,但如果它们是第一个或最后一个,则不匹配。因此,我需要在选择时将管道附加到列值的任意一端,这样就可以得到类似的内容:
SELECT products.*, tours.*, CONCAT("|",products.countries,"|") AS country_list
FROM products INNER JOIN tours ON products.id=tours.product_id
GROUP BY products.id
但如果我尝试添加WHERE country_list LIKE '|%33%|'
,我会收到"undefined index: country_list"
错误..
我在这里做错了什么?
答案 0 :(得分:5)
您可以使用:
WHERE CONCAT("|",products.countries,"|") LIKE '%|33|%'
请注意,管道在百分号内
答案 1 :(得分:3)
在WHERE子句中不能使用别名。只是在HAVING条款中
“可以在查询选择列表中使用别名为列赋予不同的名称。您可以使用GROUP BY,ORDER BY或HAVING子句中的别名来引用列”1
所以你可以做到
HAVING country_list LIKE '|%33%|'
或者没有别名的声明,斯科特发布了。