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)
上的复合索引,应该可以很好地优化此查询。
我正在尝试提取表 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)
上的复合索引,应该可以很好地优化此查询。