如何从 MySQL 中的连接表中获取孤儿

Vin*_*rez 4 mysql sql myisam

想象有2个表,第一个是产品(产品)列表,第二个是产品和另一个表(类别)之间的连接表,称为产品类别

产品:

id   |  name
------------
1       Lorem 
2       Ipsum 
3       Dolor 
4       Sit 
Run Code Online (Sandbox Code Playgroud)

产品类别

product_id  | categories_id
---------------------------
1             3
1             6
4             1
2             2
Run Code Online (Sandbox Code Playgroud)

如何获取孤立元素,我的意思是没有类别的元素,所以在这种情况下:3,使用 MyISAM 以有效的方式(+30k 记录)?

这有点像显示所有不可连接的行,但这种语法对我来说很奇怪......

Dee*_*pak 6

您可以通过两种方式实现这一目标:

使用子查询:

SELECT name FROM products 
WHERE id NOT IN (SELECT product_id FROM products-categories);
Run Code Online (Sandbox Code Playgroud)

或使用 JOIN (首选方式)

SELECT name FROM products 
LEFT JOIN products_categories ON (id=product_id)
WHERE product_id IS NULL;
Run Code Online (Sandbox Code Playgroud)

最好加入 sqlfiddle 演示:http://sqlfiddle.com/#!9/14ab38 /1


Adr*_*nBR 5

select * from products p 
left join product_categories pc on p.id=pc.product_id 
where pc.product_id is null
Run Code Online (Sandbox Code Playgroud)

将返回在 product_Category 中未找到的表产品中的所有产品。LEft join 和 where 非常快。30k 记录也很少,所以不用担心。