【问题标题】:MySQL Query - Find_in_set on comma separated columnsMySQL Query - Find_in_set 在逗号分隔的列上
【发布时间】:2013-06-25 16:25:09
【问题描述】:

我在执行查询事件数据库时遇到问题。 目的是关于运动,结构是:

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

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

你能帮帮我吗?

提前致谢。

【问题讨论】:

  • 规范化你的数据库架构
  • 您可能想要查看更改数据模型,将逗号分隔的值存储在单元格中是不好的做法,因为它会降低灵活性。我会做的是与所有城市的活动相关联的第二张桌子,以及所有运动的另一张桌子。
  • 我还建议看看这个stackoverflow.com/questions/5015403/… 的答案。

标签: mysql


【解决方案1】:

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

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)

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

【讨论】:

  • @mcv 您确实应该规范化您的数据,而不是在表格列中存储逗号分隔的列表
  • 哦,我同意,但我正在处理的网站远没有达到一个好的标准。我正在朝着它努力。那是游戏的后期阶段。我希望它是第一个,但我走进去,我已经废弃了大量混合了 php、html 和 javascript 的循环查询的意大利面条代码。如果你愿意的话,这是开发者的噩梦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
相关资源
最近更新 更多