SQL/PHP find_in_set

SQL/PHP find_in_set

我正在尝试提取表 A (profiles.category) 中的 1 行与表 B (projects.categorysecond) 中的 1 行匹配的结果,但是我没有得到结果。

*重要 projects.categorysecond 将在只有 1 个类别到由 ; 分隔的多个类别之间变化。示例:渥太华或渥太华;多伦多;蒙特利尔或渥太华;蒙特利尔或多伦多;蒙特利尔

profiles.category 将始终只有 1 个类别,永远不会被删除。

我需要确保无论 profiles.category 中有 OTTAWA OR OTTAWA;TORONTO;MONTREAL,只要有 1 个词匹配,它就会拉取结果。

我目前正在尝试以下查询:

SELECT p.*, up.* FROM users_profiles up INNER JOIN projects p ON find_in_set(up.category, p.categorysecond) > 0

FIND_IN_SET() 只能将逗号理解为分隔符。阅读 https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_find-in-set

因此您可以将 ; 替换为 ,,然后进行比较:

SELECT p.*, up.* 
FROM users_profiles up 
INNER JOIN projects p 
  ON FIND_IN_SET(up.category, REPLACE(p.categorysecond, ';', ',')) > 0

我必须指出,如果您想编写在 semicolon-separated 字符串中查找单个单词的表达式,这不是存储数据的好方法。参见 my answer to Is storing a delimited list in a database column really that bad?

您应该在 project_categories table 中每行存储一个项目类别。那么你的查询会更容易:

SELECT p.*, up.* 
FROM users_profiles up 
INNER JOIN project_categories pc
  ON up.category = pc.category
INNER JOIN projects p 
  ON p.project = pc.project;

使用 project_categories(category,project) 上的复合索引,应该可以很好地优化此查询。