我正在制作一个小型城市指南应用程序,其中我在数据库中有两个表:
country(country_code(pk),country_name)
city(city_id(pk), city_name, city_details, country_code(fk))
现在,如果用户搜索特定city_name
或country_name
,我可以使用LIKE
运算符:
SELECT city_name,city_details,country_name FROM table city INNER JOIN country ON city.contry_code = country.country_code WHERE city_name LIKE "search_string";
但是,如果用户搜索逗号分隔值,例如搜索'Ahmedabad,India'
而不是'Ahmedabad'
,该怎么办?然后该怎么办?请帮助。我正在使用PHP和MySQL。
答案 0 :(得分:4)
@xyz我认为你可以使用正则表达式在MYSQL中做到这一点。
SELECT * FROM city INNER JOIN country ON
city.contry_code = country.country_code
WHERE CONCAT(city.city_name,", ", country.country_name) REGEXP '^your search string'
这里“^”将匹配字符串的开头。有关MYSQL中正则表达式的更多信息,请参阅此link
答案 1 :(得分:2)
如果你提供数据是唯一的{state,Country}案例,你可以在运行查询之前使用explode或其他php函数拆分字符串,并且可以添加过滤器,例如state = {ahemdabad}&& country = {India}。 这取决于您的要求,您也可以使用||而不是&&。
答案 2 :(得分:0)
使用split(",")
课程中的String
。之后,您只需要使用SQLite查询搜索结果。
示例:
String[] results = etSearch.getText().toString().split(",");
for(int i = 0; i < results.length; i++)
myDatabaseInstance.search(results[i]);
答案 3 :(得分:0)
@ keshav-jha的解决方案非常简单明了。它连接城市和国家名称,并将其与正则表达式进行匹配。仅适用于以下任一特定输入格式:Ahmadabad,India
(逗号后无空格)或Ahmadabad, India
(逗号后面的空格)。因此,如果搜索查询必须处理此空间问题,我们可以在此处取消REGEXP
,并将简单like
语句与REPLACE
结合使用:
SELECT * FROM city INNER JOIN country ON
city.contry_code = country.country_code
WHERE CONCAT(city.city_name,",", country.country_name) like REPLACE(TRIM('your search string'),' ','');
您可以选择使用REGEXP而不是LIKE,但是您必须找到一种方法来删除REGEXP表达式本身内的字符串中的所有空格字符。因为MySql使用Henry Spencer的正则表达式实现符合POSIX 1003.2,它不允许free-spacing mode
在正则表达式的开头使用?x
,所以你需要找到另一个在REGEXP中强制执行自由间隔模式的方法或者,如果您出于任何原因选择使用REGEXP,则可以使用@ keshav-jha的原始代码添加逻辑表达式:
SELECT * FROM city INNER JOIN country ON
city.contry_code = country.country_code
WHERE CONCAT(city.city_name,", ", country.country_name) REGEXP '^your search string' OR CONCAT(city.city_name,",", country.country_name) REGEXP '^your search string';