2015-06-21 161 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; 

此查詢無法利用類別聯接的索引。這意味着它會很慢。正確的數據結構 - 聯結表 - 將解決此性能問題。