mysql获取产品搜索结果中的类别计数

w1jd8yoj  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(320)

我有一个页面的搜索结果,其中出现的产品是由用户搜索。我需要一个查询,这将给我一个所有产品的类别计数。
有一些条件:
一个产品可以有多个类别。
有一个产品表:

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

和一个产品类别关系

id    productId     catId
 1     1             101
 2     1             111
 3     2             111
 4     3             111

我用于搜索结果的查询是:

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查询实现,或者我需要在其中使用php循环?
提前谢谢。

eivgtgni

eivgtgni1#

从你的结果和sql我想你可以试试这个。
只是 JOIN 以及 COUNT ,您可以移动到 WHEREHAVING 因为有来自聚合函数的条件。
架构(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              |

db fiddle视图

相关问题