MySQL Join с 3 таблицами и пустыми строками
Я сейчас сдаюсь с моим JOIN, создающим представление по причинам поиска - мне нужна помощь:/
Вот мои таблицы:
профили
id company user_id
1 ACME 2
2 Joe 4
3 Wolf 5
пользователей
id role_id online
2 4 2010-10-08
4 2 2010-10-08
5 4 2010-10-08
Рубрики
id title
1 Steel
2 Stone
3 Wood
Profiles_Rubrics
profile_id rubric_id
1 1
1 2
2 3
2 1
Из этих таблиц я хочу получить представление с одной строкой для каждого профиля, включая профили, которые не имеют записей в HABTM Profiles_Rubrics. Пока я просто могу получить профили, которые имеют записи в таблице HABTM:
CREATE OR REPLACE VIEW Catalog_Branches AS
SELECT
profiles.id,
profiles.company,
GROUP_CONCAT(DISTINCT CAST(rubrics.id AS CHAR) SEPARATOR ', ') AS rubric,
GROUP_CONCAT(DISTINCT CAST(rubrics.title AS CHAR) SEPARATOR ', ') AS rubric_title,
profiles.user_id
FROM
profiles,
profiles_rubrics
JOIN rubrics ON profiles_rubrics.rubric_id=rubrics.id,
users
WHERE
profiles_rubrics.profile_id=profiles.id
AND profiles_rubrics.rubric_id=rubrics.id
AND users.id=profiles.user_id
AND users.profile_online IS NOT NULL
AND users.role_id!=1
GROUP BY
profiles.id
Я попробовал это с помощью других ответов здесь в stackru, но не могу добраться до точки, где он возвращает все профили. Я не большой специалист по MySQL, как видно из всего вышесказанного:)
1 ответ
Решение
Вы должны использовать левое соединение.
Что-то вроде
SELECT
profiles.id,
profiles.company,
GROUP_CONCAT(DISTINCT CAST(rubrics.id AS CHAR) SEPARATOR ', ') AS rubric,
GROUP_CONCAT(DISTINCT CAST(rubrics.title AS CHAR) SEPARATOR ', ') AS rubric_title,
profiles.user_id
FROM
profiles LEFT JOIN
profiles_rubrics ON profiles_rubrics.profile_id=profiles.id LEFT JOIN
rubrics ON profiles_rubrics.rubric_id=rubrics.id LEFT JOIN
users ON users.id=profiles.user_id
WHERE
users.profile_online IS NOT NULL
AND users.role_id!=1
GROUP BY
profiles.id
Посмотрите на SQL-соединения