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