MySQL Join с 3 таблицами и пустыми строками - PullRequest
1 голос
/ 19 октября 2010

Я сейчас сдаюсь, создавая 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

Я попробовал это с помощью других ответов здесь в stackoverflow, но не могу добраться до точки, где он возвращает все профили.Я не большой специалист по MySQL, как видно из всего вышесказанного:)

1 Ответ

4 голосов
/ 19 октября 2010

Вам нужно использовать ЛЕВЫЕ СОЕДИНЕНИЯ.

Что-то вроде

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-соединения

...