MySQL加入3个表和空行

时间:2010-10-19 08:29:24

标签: mysql join rows has-and-belongs-to-many

我现在放弃了我的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 个答案:

答案 0 :(得分:4)

你需要使用LEFT JOINS。

这样的东西
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 Joins