MySql получить количество категорий в результате поиска продукта - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть результат поиска на странице, где появляются те товары, которые ищет пользователь. Мне нужен запрос, который подсчитает все категории товаров.

Есть несколько условий:

  1. Один товар может иметь несколько категорий.

  2. Существует одна таблица ПРОДУКТА:

    productId     productName
    1             corns
    2             Turmeric
    3             Cornetto
    

    одна таблица КАТЕГОРИЙ:

    catId       catName      ParentCategory
    101         Vegetable     111
    110         Chair         0
    111         Edible        0
    112         Table         0
    113         Rooms         0
    

    и один PRODUCT_CATEGORIES_RELATION

     id    productId     catId
     1     1             101
     2     1             111
     3     2             111
     4     3             111
    
  3. Запрос, который я использую для результата поиска:

    SELECT p.productName,
           GROUP_CONCAT(c.catId) as categoryid,
           GROUP_CONCAT(c.ParentCategory), 
           c.catName,
           c.Parent_Category 
    FROM Products p 
    LEFT JOIN `REL_Products__Categories` pc 
        ON pc.`productId` = p.`productId` 
    LEFT JOIN `Categories` c 
        ON pc.`catId` = c.`catId` 
    WHERE p.isActive = 1 
      AND p.Searchable = 1 
    GROUP BY p.record_number 
    HAVING (p.productName LIKE '%edible%' 
              OR p.Description LIKE '%edible%' 
              OR c.catName LIKE '%edible%)
    

Этот запрос дает мне следующие результаты:

productId   productName     categoryid     ParentCategory

1            corns            101,111      111,0

2            Turmeric         111          0

3            Cornetto         111          0

Теперь мне нужно выше в этой форме:

Category Id    Count      Parent Id

101            1          111

111            3          0

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

Или это возможно только с помощью Sql Query или мне нужно будет использовать в нем циклы PHP?

Заранее спасибо.

1 Ответ

0 голосов
/ 08 сентября 2018

Исходя из вашего результата и SQL, я думаю, вы можете попробовать это.

просто JOIN и COUNT. Условие Вы можете перейти к WHERE из HAVING, поскольку ВЫХОДИТ из условия агрегатной функции.

Схема (MySQL v5.7)

create table Products(
   productId int,
   productName varchar(50)
);  




create table CATEGORIES (
   catId int,
   catName varchar(50),
   ParentCategory int
);  




insert into CATEGORIES  values (101,'Vegetable',111);
insert into CATEGORIES  values (110,'Chair',0);
insert into CATEGORIES  values (111,'Edible',0);
insert into CATEGORIES  values (112,'Table',0);
insert into CATEGORIES  values (113,'Rooms',0);


create table PRODUCT_CATEGORIES_RELATION(
   id int,
   productId int,
   catId int
);  

insert into Products values (1,'corns');
insert into Products values (2,'Turmeric');
insert into Products values (3,'Cornetto');

insert into PRODUCT_CATEGORIES_RELATION values (1,1,101);
insert into PRODUCT_CATEGORIES_RELATION values (2,1,111);
insert into PRODUCT_CATEGORIES_RELATION values (3,2,111);
insert into PRODUCT_CATEGORIES_RELATION values (4,3,111);

Запрос № 1

SELECT  pcr.catId,COUNT(*),c.ParentCategory
FROM 
Products p
LEFT JOIN PRODUCT_CATEGORIES_RELATION pcr ON pcr.productId = p.productId
LEFT JOIN CATEGORIES c on c.catId = pcr.catId
GROUP BY pcr.catId,c.ParentCategory;

| catId | COUNT(*) | ParentCategory |
| ----- | -------- | -------------- |
| 101   | 1        | 111            |
| 111   | 3        | 0              |

Просмотр на БД Fiddle

...