MySQL 通过 FIND_IN_SET 使用定界符进行多次连接

MySQL Multiple Join with delimiting via FINDINSET

我正在尝试从第二个和第三个 table 中的列连接到下面第一个 table 中的两个不同列。

我希望加入 users.id 到 job_listings.id 到 return users.username,并加入并分隔 job_listings.categories 到 job_categories.id 到return job_categories.description 通过 FIND_IN_SET

job_listings
id    |  employer_id  |  categories
1     |       1       |  1,2
2     |       1       |  2

users
id    |  username  |  type
1     |    foo     |  employer
2     |    wat     |  employer

job_categories
id    |  description
1     |     fun
2     |     hak

我想要以下格式的输出:

output
username  |    type    |  category  |  description
  foo     |  employer  |     1      |      fun
  foo     |  employer  |     2      |      hak
  foo     |  employer  |     2      |      hak

我尝试使用以下代码的各种排列:

SELECT users.username, users.type, job_listings.categories FROM users
JOIN job_listings ON users.id
JOIN job_listings AS category ON FIND_IN_SET(category.categories, job_categories.id)
ORDER BY users.username, category.categories

我从其他答案中得知,我需要使用别名才能使用具有相同 table 的多个 JOIN 操作,但尽管采用了其他答案,但我仍然收到与声明别名相关的错误,或者 returning 输出包含一个带有别名但没有数据的列 return 在该列中编辑。

首先,你应该规范你的设计。您不应将整数值存储在字符串中。你不应该有你不能这样声明的外键引用。您不应将列表存储在字符串中。这是足够的理由吗?您想要 JobCategories 的联结点 table,每个作业一行,每个类别一行。

有时,我们会被其他人糟糕的决定所困,无法轻易改变。在这种情况下,您需要这样的查询:

SELECT u.username, u.type, jc.id, jc.category
FROM users u JOIN
     job_listings jl
     ON u.id = jl.employer_id and u.type = 'employer' join
     job_categories jc
     ON FIND_IN_SET(jc.id, j.categories) > 0
ORDER BY u.username, jc.category;

此查询无法利用类别连接的索引。这意味着它会很慢。正确的数据结构——连接点 table——将解决这个性能问题。