mysql - SQL/PHP find_in_set

标签 mysql sql select inner-join 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

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

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

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) 上的复合索引,应该可以很好地优化此查询。

关于mysql - SQL/PHP find_in_set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42263738/

相关文章:

mysql - 将巨大的 MySQL 转储文件恢复到 MS SQL Server 2008

php - 我无法在数据库中注册为成员 php 使用 ajax 进行注册事件

sql - Oracle SQL - 匹配时更新并插入

mysql - SQL中的多个like运算符

javascript - 使用每个选择的值填充 jquery 数组

php - 如何在php中将数据发送到另一个文件

php - 有哪些方法可以防止在表单中重复发布? (PHP)

mysql - 为什么连接表时 ORDER BY 结果会改变?

sql - 在 SQL Server 中将月份名称转换为月份编号

html - 输入、选择比例问题