Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 选择所有相关产品_Mysql_Sql - Fatal编程技术网

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。