2017-07-17 110 views
1

我想从公司类别表中获取不存在于公司类别交叉表中的类别id和名称。例如,公司ID为3早已1类和2类,我想将SQL结果获得3类 Company table如何做mysql连接以获得3个表格的结果

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 

回答

1

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

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

选择所有的数据,如果您单独找到的唯一的未使用类别为每个公司。使用这样的事情(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) 
+0

是的我正在寻找未使用的类别。我没有得到你Jan。我应该使用什么查询? –

+0

请检查我的查询上,请;) –

+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 
+0

这会让我得到公司未使用的类别吗? –

+0

在提出这样的问题之前,请务必诚实地尝试理解我的答案并尝试编码。 – Shadow

相关问题