Mysql 选择所有相关产品
我有一张名为Mysql 选择所有相关产品,mysql,sql,Mysql,Sql,我有一张名为教学的表格: id,名称,说明 以及产品表: id,name,description,teachingID 我想从教学中选择所有与之相关的产品。如果有一个教学在产品表中没有产品,我不想要它 到目前为止,我提出了: SELECT * FROM `teachings` LEFT JOIN `products` ON `products`.`teachingID` = `teachings`.`id` WHERE COUNT(`products`) > 0 但这是行不通的:(有人能
教学的表格
:
id
,名称
,说明
以及产品
表:
id
,name
,description
,teachingID
我想从教学中选择所有与之相关的产品。如果有一个教学在产品表中没有产品,我不想要它
到目前为止,我提出了:
SELECT * FROM `teachings`
LEFT JOIN `products` ON `products`.`teachingID` = `teachings`.`id`
WHERE COUNT(`products`) > 0
但这是行不通的:(有人能给我指出正确的方向吗?如果你只想返回至少一个相关产品的教学,那么就使用
exists
子查询。这样你就不必计算每次教学的产品数
我的mysql
生锈了,但这应该可以
select *
from teachings t
where exists
(
select 1
from products p
where p.teachingID = t.id
)
如果您只想返回至少有一个与之相关联的产品的教学,那么使用
exists
子查询。这样您就不必计算每个教学的产品数
我的mysql
生锈了,但这应该可以
select *
from teachings t
where exists
(
select 1
from products p
where p.teachingID = t.id
)
这里有一个额外的答案,只是为了显示我在评论中提到的IN子句。任务非常简单:获取存在的产品记录的教学记录。换句话说:获取产品表中提到的教学记录。因此在这里使用
存在的或中的
联接表只会混淆正在进行的操作,所以不要这样做
存在
查询:
select *
from teachings t
where exists (select * from products p where p.teachingid = t.id);
查询中的,由于子查询与主查询不相关,因此更具可读性:
select *
from teachings t
where id in (select teachingid from products p);
这里有一个额外的答案,只是为了显示我在评论中提到的IN子句。任务非常简单:获取存在的产品记录的教学记录。换句话说:获取产品表中提到的教学记录。因此在这里使用存在的或中的
联接表只会混淆正在进行的操作,所以不要这样做
存在
查询:
select *
from teachings t
where exists (select * from products p where p.teachingid = t.id);
查询中的,由于子查询与主查询不相关,因此更具可读性:
select *
from teachings t
where id in (select teachingid from products p);
那么为什么要使用左连接呢!?!?!?!!?我更喜欢内部连接this@Strawberry我总是用左连接来完成我的所有连接,直到现在它才让我失望!:在我看来,你应该使用正确的工具来完成这项工作。我对你选择被接受的答案感到困惑。(性能问题除外)根据我下面的回答,这种情况下正确的解决方案肯定是内部联接。请注意,内部关键字是可选的,并且经常被忽略。那么为什么要使用左联接呢!?!?!?!?!!?我更喜欢内部联接this@Strawberry我所有的连接都使用左连接,直到现在它才让我失望我是这项工作的合适工具。我对你选择被接受的答案感到困惑。(性能问题除外)根据我下面的回答,这种情况下正确的解决方案肯定是内部联接。请注意,内部关键字是可选的,经常被省略。这是一种直接的方法。您甚至可以使用in
子句而不是EXISTS
子句,这将使查询更加简单和可读。@Chud37但是为什么选择这样一个精心设计的解决方案?这是一个直截了当的方法。你甚至可以使用IN
子句而不是EXISTS
子句,这将使查询更简单、更可读。@Chud37但是为什么选择这样一个精心设计的解决方案呢?你是对的,这更可读。我已经将答案标记为corr但是谢谢你,我喜欢你的第二个SQL。你是对的,那更可读。我已经把答案标记为正确,但是谢谢你,我喜欢你的第二个SQL。