2015-06-21 2 views
0

Я пытаюсь присоединиться к двум различным столбцам в первой таблице ниже из столбцов во второй и третьей таблицах.MySQL Multiple Join with delimiting через FINDINSET

Я хотел бы присоединиться к users.id job_listings.id вернуться users.username, а также JOIN и разграничить job_listings.categories к job_categories.id вернуть 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 

Я знаю из других ответов, что мне нужно использовать псевдоним, чтобы использовать несколько операций 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; 

Этот запрос не может воспользоваться индексами для объединения категорий. Это означает, что он будет медленным. Правильная структура данных - таблица соединений - устранит эту проблему с производительностью.