我有一个商店,有独特的产品,有独特的属性。所以有三个表:商店、产品和属性。最近在系统中出现了一个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属性。
1条答案
按热度按时间332nm8kg1#
首先,您不需要加入表stores,因为您在products表上已经有store\ id,并且您不需要从商店获得任何附加信息(如名称或描述)。理解了这一点,我将继续下一个问题:
参考示例:db fiddle