MySQL-根据现有关系中的两个关系返回值

时间:2018-10-23 21:44:39

标签: mysql sql

我有一家商店,商店有独特的产品,有独特的属性。因此,存在三个表:商店,产品和属性。最近,系统中存在一个错误,该错误使某些商店的某些产品具有两个不同的“名称”属性。一个就是“名称”,另一个就是“标签”。

我需要一个查询,该查询返回具有两个不同名称产品的商店ID。

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 个答案:

答案 0 :(得分:0)

首先,您不需要加入表商店,因为您已经在产品表上拥有 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