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

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循环?
提前谢谢。

最佳答案

从你的结果和SQL我想你可以试试这个。
只需JOINCOUNT,条件就可以从WHERE移动到HAVING,因为有from aggregate函数条件。
模式(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              |

View on DB Fiddle

10-04 15:28
查看更多