3

我有一个查询问题,我正在执行一个对事件数据库进行搜索的查询。目的是关于运动,结构是:

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 的搜索结果是,例如:

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)
;

搜索一个城市哪个好,但如果用户搜索两个或更多,我没有办法显示它。

你能帮我么?

提前致谢。

4

1 回答 1

7

当用户输入多个城市和/或体育项目时,将其用逗号分隔,然后查询应如下所示:

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)

如您所见,这确实令人费解且效率低下,我建议您按照评论中的建议规范化您的架构。

于 2013-06-28T00:54:38.787 回答