mysql-基于现有关系上的两个关系返回值

mrphzbgm  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(332)

我有一个商店,有独特的产品,有独特的属性。所以有三个表:商店、产品和属性。最近在系统中出现了一个bug,它给一些商店的某些产品提供了两个不同的“名称”属性。一个是简单的“名称”,另一个是“标签”。
我需要一个查询,返回商店标识有两个不同的名称的产品。

SELECT 
    stores.id
FROM
    stores
INNER JOIN
    products ON products.store_id = stores.id
INNER JOIN
    properties ON properties.product_id = products.id
WHERE
    properties.name IN ('Name' , 'Label')
GROUP BY
    products.id
HAVING
    COUNT(DISTINCT properties.name) = 2;

这就是我目前所拥有的。我正试图避免子查询,因为产品和属性都是非常大的表,我被困在这一点上。我无法从逻辑上理解为什么这个查询返回的存储既没有名称属性也没有标签属性。我仔细检查,没有一个产品有两个“名称”或“标签”属性,每个只有一个。这样就不会造成假阳性。
编辑:
架构

Table: Stores
Columns:
id int(11) AI PK 
domain_id int(11) 
name varchar(255) 
description varchar(255)
address varchar(255)
details longtext

Table: products
Columns:
id int(11) AI PK 
store_id int(11) 
price varchar(255)

Table: properties
Columns:
id int(11) AI PK 
product_id int(11) 
name varchar(255) 
value varchar(255) 
position int(11)

数据

Store Data Structure
{ id: 2341, domain_id: 4, name: "East LA", description: nil, address: nil, details: nil }

Products Data Structure
{ id: 6482773, store_id: 2341, price: "5.00" } 

Property Data Sturcture
{ id: 9132472, product_id: 6482773, name: "Name", value: "Paper Plates", position: 1 }

{ id: 9132472, product_id: 6482773, name: "Label", value: "Paper Plates", position: 2 }

仅返回存储ID。在本例中,它将返回2341,因为它同时具有label和name属性。

332nm8kg

332nm8kg1#

首先,您不需要加入表stores,因为您在products表上已经有store\ id,并且您不需要从商店获得任何附加信息(如名称或描述)。理解了这一点,我将继续下一个问题:

SELECT 
    DISTINCT p1.store_id
FROM
    products AS p1
INNER JOIN
    properties AS p2 ON p2.product_id = p1.id AND p2.name IN ('Name' , 'Label')
GROUP BY
    p1.id, p1.store_id
HAVING
    COUNT(p2.name) >= 2;

参考示例:db fiddle

相关问题