SQL Как получить категории, которые не содержат продукты? - PullRequest
0 голосов
/ 03 марта 2019
SELECT DISTINCT {c2.name} 
FROM 
    {BrandCategory AS c  
    JOIN CategoryProductRelation AS c2p  
    ON  {c.pk} = {c2p.source}  
    JOIN Product AS p  
    ON  {c2p.target} = {p.pk}  
    JOIN CategoryProductRelation AS c2p2  
    ON  {p.pk} = {c2p2.target}  
    JOIN TaxonomyCategory AS c2 ON {c2.pk} = {c2p2.source} 
    JOIN CatalogVersion AS cat 
    ON {c.catalogVersion} = {cat.PK}} 
WHERE 
    {c.code} = 'brand-MCH' 
    AND{cat.version} = 'Online' 
    AND {c2.code} NOT LIKE'%webFamily%' 
    AND {p.code} IN ('35365','34299')

Вышеупомянутый запрос извлекает категории таксономии, которые содержат продукты '35365' и '34299'

Result:
Passenger
Touring
All-Season
Truck

All Categories:
All-Season
Performance
Passenger
Winter
Touring
Summer
Truck
All-Terrain
Competition
Lawn

Теперь необходимо извлечь все остальные категории таксономии, то есть категории, которые не содержат продукты '35365 'и' 34299 '

Попытка 1: (Ошибка) (НЕ ВХОД)

SELECT  DISTINCT {c2.name}
    FROM  {BrandCategory AS c
    JOIN  CategoryProductRelation AS c2p  ON {c.pk} = {c2p.source}
    JOIN  Product AS p  ON {c2p.target} = {p.pk}
    JOIN  CategoryProductRelation AS c2p2  ON {p.pk} = {c2p2.target}
    JOIN  TaxonomyCategory AS c2  ON {c2.pk} = {c2p2.source}
    JOIN  CatalogVersion AS cat  ON {c.catalogVersion} = {cat.PK}}
    WHERE  {c.code} = 'brand-MCH' AND{cat.version} = 'Online'
      AND  {c2.code} NOT LIKE'%webFamily%'
      AND  {p.code} NOT IN ('35365','34299') 

Попытка 2: (Ошибка) (НЕ СУЩЕСТВУЕТ)

SELECT  DISTINCT {c2.name}
    FROM  {BrandCategory AS c
    JOIN  CategoryProductRelation AS c2p  ON {c.pk} = {c2p.source}
    JOIN  Product AS p  ON {c2p.target} = {p.pk}
    JOIN  CategoryProductRelation AS c2p2  ON {p.pk} = {c2p2.target}
    JOIN  TaxonomyCategory AS c2  ON {c2.pk} = {c2p2.source}
    JOIN  CatalogVersion AS cat  ON {c.catalogVersion} = {cat.PK}}
    WHERE  {c.code} = 'brand-MCH' AND{cat.version} = 'Online'
      AND  {c2.code} NOT LIKE'%webFamily%'
      AND  {c2.code}
      AND  NOT EXISTS ({{
        SELECT  DISTINCT {c3.name}
            FROM  {BrandCategory AS c
            JOIN  CategoryProductRelation AS c2p  ON {c.pk} = {c2p.source}
            JOIN  Product AS p  ON {c2p.target} = {p.pk}
            JOIN  CategoryProductRelation AS c2p2  ON {p.pk} = {c2p2.target}
            JOIN  TaxonomyCategory AS c3  ON {c3.pk} = {c2p2.source}
            JOIN  CatalogVersion AS cat  ON {c.catalogVersion} = {cat.PK}}
            WHERE  {c3.name}={c2.name}
              AND  {c.code} = 'brand-MCH' AND{cat.version} = 'Online'
              AND  {c3.code} NOT LIKE'%webFamily%'
              AND  {p.code} IN ('35365','34299')}}
                      ) 

Попытка 3: (Сбой) (НЕ В НАПРАВЛЕНИИ)

SELECT  DISTINCT {c2.name}
    FROM  {BrandCategory AS c
    JOIN  CategoryProductRelation AS c2p  ON {c.pk} = {c2p.source}
    JOIN  Product AS p  ON {c2p.target} = {p.pk}
    JOIN  CategoryProductRelation AS c2p2  ON {p.pk} = {c2p2.target}
    JOIN  TaxonomyCategory AS c2  ON {c2.pk} = {c2p2.source}
    JOIN  CatalogVersion AS cat  ON {c.catalogVersion} = {cat.PK}}
    WHERE  {c.code} = 'brand-MCH' AND{cat.version} = 'Online'
      AND  {c2.code} NOT LIKE'%webFamily%'
      AND  {c2.name} NOT IN ({{
        SELECT  DISTINCT {c2.name}
            FROM  {BrandCategory AS c
            JOIN  CategoryProductRelation AS c2p  ON {c.pk} = {c2p.source}
            JOIN  Product AS p  ON {c2p.target} = {p.pk}
            JOIN  CategoryProductRelation AS c2p2  ON {p.pk} = {c2p2.target}
            JOIN  TaxonomyCategory AS c2  ON {c2.pk} = {c2p2.source}
            JOIN  CatalogVersion AS cat  ON {c.catalogVersion} = {cat.PK}}
            WHERE  {c.code} = 'brand-MCH' AND{cat.version} = 'Online'
              AND  {c2.code} NOT LIKE'%webFamily%'
              AND  {p.code} IN ('35365','34299')}}
                          ) 

...

Result:
All-Season
Performance
Passenger
Winter
Touring
Summer
Truck
All-Terrain
Competition
Lawn

Expected:
Performance
Winter
Summer
All-Terrain
Competition
Lawn

Пожалуйста, помогите получить те категории, которые не содержат, с оптимальной проверкой производительности запросов.

Кроме того, если есть способ получить все категории с некоторым флагом в результате, чтобы дифференцировать, какой продукт содержит true илинет, это было бы абсолютным золотом, потому что здесь мы дважды нажимаем DB, чтобы получить категории, которые содержат, а затем категории, которые не содержат, посредством вызова по требованию

Примечание: Этопо существу, SQL-запросы, но только слегка модифицированные этими скобками для поддержки Fформат гибкого поискового запроса в Hybris Framework

Ответы [ 2 ]

0 голосов
/ 10 марта 2019

Начните с просмотра, дают ли NOT EXISTS и NOT IN правильные значения.

Для EXISTS не беспокойтесь ни о DISTINCT, ни об указании столбца.Этого достаточно:

NOT EXISTS ( SELECT 1 FROM ... )

Удалить все JOIN, которые не имеют отношения к проблеме.Это поможет понять, что не так.

Что такое скобки?Возможно, вам следует удалить тег [mysql]?

0 голосов
/ 04 марта 2019

Запросы -
1. Использование NOT IN-
SELECT {c.code} FROM {Product as p join CategoryProductRelation as c2p on {c2p.target} = {p.pk} join Category as c on {c2p.source} = {c.pk}} WHERE {p.code} NOT IN ('35365','34299')

Использование NOT EXISTS-
SELECT {c.code} FROM {CategoryProductRelation as c2p join Category as c on {c2p.source} = {c.pk}} WHERE NOT EXISTS ({{SELECT {p.code} FROM {Product as p} WHERE {p.code} IN ('35365','34299') and {c2p.target}={p.pk}}})

Использование подзапроса-
SELECT {c.code} FROM {Product as p join CategoryProductRelation as c2p on {c2p.target} = {p.pk} join Category as c on {c2p.source} = {c.pk}} WHERE {p.pk} IN ({{SELECT {pk} FROM {Product} WHERE {code} IN ('35365','34299')}})

...