如何做mysql join来获取结果表3表

时间:2017-07-17 08:04:29

标签: mysql sql

我想从公司类别表中获取类别ID和名称,这在公司类别交叉表中不存在。例如,id为3的公司已经有了类别1和类别2,我希望sql结果得到类别3 Company table

Company category

Company category cross

我尝试了以下声明但未获得预期结果

SELECT `wp_bmg_company_category`.id, `wp_bmg_company_category`.name 
FROM `wp_bmg_company_category` 
INNER JOIN `wp_bmg_company_category_cross` 
ON `wp_bmg_company_category`.id != `wp_bmg_company_category_cross`.categoryid

2 个答案:

答案 0 :(得分:1)

如果我理解正确您搜索现在未使用的类别。

  1. 选择所有具有类别ID的公司数据(仅返回类别ID)
  2. category id NOT IN (use 1. select data)
  3. 类别中选择所有数据

    如果您分别找到每家公司唯一未使用的类别。使用类似的内容( ADD company_id 分别搜索每家公司,搜索未使用的类别):

    SELECT *
    FROM category ca
    WHERE category_id NOT IN
         (SELECT category_id
          FROM category     c1
               JOIN category_cross cc ON c1.id = cc.category_id
          WHERE company_id = 1)
    

答案 1 :(得分:0)

您需要的是一个外连接(左或右),可以从表中检索所有记录,无论它是否存在于另一个表中。 (您可以使用not in()not exists()代替外部联接。)

您需要的另一种技术称为笛卡尔连接,您可以将一个表中的所有记录与另一个表中的所有记录进行匹配。在这种情况下,将公司表中的所有记录与类别中的所有记录进行匹配,以获得公司 - 类别组合的完整列表。然后从中减去您拥有的类别列表。

select co.id, co.name, ca.id, ca.name
from (wp_bmg_company co join wp_bmg_company_category ca) --this creates the Cartesian join
left join wp_bmg_company_category_cross cr on co.id=cr.companyid and ca.id=cr.categoryid
where cr.id is null  --only the non-matched pairs should remain