我遇到了一个问题,我正在进行搜索事件数据库。 目的是关于体育,结构是:
id_event event_sport event_city
1 10 153
2 12 270
3 09 135
表运动就像:
sport_id sport_name
1 Basketball
表格城市是:
city_id city_name
1 NYC
因此事情变得复杂,因为我的事件表就像:
id_event event_sport event_city
1 10,12 153,270
2 7,14 135,271
3 8,12 143,80
我有一个多输入搜索表单,以便人们可以在他们的城市中搜索多个运动或多个城市的活动。我正在使用Chosen
Chosen的搜索结果是,例如:
City = 153,270 (if user selected more than one city)
Sport = 12 (if user only selected one sport, can be "9,15")
所以我需要的是在同一列中搜索城市和体育的多个值,用逗号分隔,知道有时我们只能搜索一个值,如果用户没有输入多个值。
我目前的查询是:
SELECT * FROM events e
LEFT JOIN cities c ON e.event_city=c.city_id
LEFT JOIN sports s ON e.event_sport=s.sport_id
WHERE FIND_IN_SET('1CITY', e.event_city) AND FIND_IN_SET('1SPORT', e.event_sport)
;
搜索一个城市最好,但如果用户搜索两个或更多城市,我就无法展示它。
你能帮帮我吗?
提前致谢。
答案 0 :(得分:4)
当用户输入多个城市和/或体育时,请用逗号分隔,然后查询应如下所示:
SELECT * FROM events e
LEFT JOIN cities c on e.event_city = c.city_id
LEFT JOIN sports s ON e.event_sport = s.sport_id
WHERE (FIND_IN_SET('$city[0]', e.event_city) OR FIND_IN_SET('$city[1]', e.event_city) OR ...)
AND (FIND_IN_SET('$sport[0]', e.event_sport) OR FIND_IN_SET('$sport[1]', e.event_sport) OR ...)
使用PHP,您可以使用以下内容构建OR
个表达式
$city_list = implode(' OR ', array_map(function($x) { return "FIND_IN_SET('$x', e.event_city)"; }, explode(',', $_POST['cities'])));
执行相同的操作$ sport_list,然后您的SQL字符串将包含:
WHERE ($city_list) AND ($sport_list)
正如您所看到的,这确实很复杂且效率低下,我建议您按照评论中的建议规范化您的架构。