Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.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/8/linq/3.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_Inner Join - Fatal编程技术网

Mysql 多重内部联接提供了意外的重复记录

Mysql 多重内部联接提供了意外的重复记录,mysql,inner-join,Mysql,Inner Join,当数据库中只有1个产品时,运行以下SELECT查询会意外地给出两次相同的记录。然而,有多个子类别链接到同一类别,但我仍然不明白为什么这会给出两个结果 ERD: 数据库的全部内容: 返回: 为什么这个产品要退两次 在psc.id=2的地方追加,仍然会得到一个产品,而其目的是只有在psc.id=1时才能找到该产品 我错过了什么?结构有问题吗?如何获取所有具有特定子类别的产品 我是否也需要将产品类别\u id和产品子类别\u id直接存储在产品中?@barmar让我意识到我只是缺少了从产品到产品

当数据库中只有1个产品时,运行以下SELECT查询会意外地给出两次相同的记录。然而,有多个子类别链接到同一类别,但我仍然不明白为什么这会给出两个结果

ERD:

数据库的全部内容:

返回:

为什么这个产品要退两次

在psc.id=2的地方追加
,仍然会得到一个产品,而其目的是只有在
psc.id=1
时才能找到该产品

我错过了什么?结构有问题吗?如何获取所有具有特定子类别的产品


我是否也需要将
产品类别\u id
产品子类别\u id
直接存储在
产品
中?

@barmar让我意识到我只是缺少了从
产品
产品子类别
的直接FK。否则,产品和子类别之间当然会缺少链接。

DISTINCT
将过滤掉重复项

SELECT DISTINCT p.id AS productId, p.name AS productName 
FROM product p
INNER JOIN product_base AS pb ON pb.id = p.product_base_id
INNER JOIN product_category AS pc ON pc.id = pb.product_category_id
INNER JOIN product_subcategory AS psc ON psc.product_category_id = pc.id;

如果需要子类别,请使用
其中psc.id=1
。您没有按子类别进行筛选。因此,您将获得与产品的子类别一样多的行。使用
选择DISTINCT
来筛选重复项。为什么
其中psc.id=2
应给出0行?它有
product\u category\u id=1
,与
product\u category
中的行相匹配。如果不这样做,应用程序如何知道它是哪个子类别?为什么希望FK直接从
product
product\u子类别
。它破坏了数据流。这不是一个好的设计。这也是我的直觉。考虑到上述问题,您如何实现更好的设计?添加
DISTINCT
关键字只会给您一行,这是您想要的,并且不会破坏关系。我会把它放在答题上,因为放在这里太长了。
SELECT DISTINCT p.id AS productId, p.name AS productName 
FROM product p
INNER JOIN product_base AS pb ON pb.id = p.product_base_id
INNER JOIN product_category AS pc ON pc.id = pb.product_category_id
INNER JOIN product_subcategory AS psc ON psc.product_category_id = pc.id;