MySQL - возвращение значения, основанного на двух отношениях существующего отношения - PullRequest
0 голосов
/ 24 октября 2018

У меня есть магазин, в котором есть уникальные товары, которые обладают уникальными свойствами.Итак, есть три таблицы: магазины, продукты и свойства.Недавно в системе была ошибка, из-за которой некоторые продукты в некоторых магазинах получали два разных свойства «name».Один - просто «имя», а другой - «ярлык».

Мне нужен запрос, который возвращает идентификаторы магазинов, в которых есть продукты с двумя разными именами.

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;

Это то, что я до сих пор.Я стараюсь избегать подзапросов, поскольку продукты и свойства представляют собой очень большие таблицы, и я застрял на этом этапе.Я не могу логически понять, почему этот запрос возвращает магазины, которые не имеют свойств как name, так и label.Я дважды проверил, и ни у одного из продуктов нет двух свойств "name" или "label", только по одному из каждогоТак что это не приведет к ложному положительному результату.

Редактировать:

Схема

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 }

Вернуть ТОЛЬКО идентификаторы магазина.В этом случае он вернет 2341, так как имеет свойство label и name.

1 Ответ

0 голосов
/ 24 октября 2018

Во-первых, вам не нужно присоединяться к таблице stores , поскольку у вас уже есть store_id в таблице products , и вам не нужнолюбая дополнительная информация (например, имя или описание) из магазина.Понимая это, я пойду со следующим запросом:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...