我想从公司类别表中获取类别ID和名称,这在公司类别交叉表中不存在。例如,id为3的公司已经有了类别1和类别2,我希望sql结果得到类别3
我尝试了以下声明但未获得预期结果
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
答案 0 :(得分:1)
如果我理解正确您搜索现在未使用的类别。
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)
答案 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