2015-06-21 162 views
0

我试图从第二个和第三个表中的列加入第一个表中的两个不同的列。MySQL多重连接通过FINDINSET分隔

我想加入users.id到job_listings.id返回users.username,并且也加入并划定job_listings.categories到job_categories.id通过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 

我渴望回到job_categories.description输出是以下格式的:

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 

我知道从其他答案我需要使用别名为了使用同一个表的多个JOIN操作,但尽管调整了其他答案,我仍然收到与声明别名有关的错误,或者返回具有列的输出该列中的别名但没有返回数据。

+1

标准化您的设计。 – Strawberry

回答

1

首先,你应该规范你的设计。你不应该在字符串中存储整数值。您不应该拥有您无法声明的外键引用。你不应该在字符串中存储列表。这足够的原因吗?您需要JobCategories的联结表,每个作业一行,每个类别一行。

有时候,我们被其他人的糟糕决定卡住了,不能轻易改变它们。在这种情况下,您需要查询如下:

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; 

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