我有一个页面的搜索结果,其中显示的是用户搜索的产品。我需要一个查询,它将给我所有的产品类别的计数。
有一些条件:
一个产品可以有多个类别。
有一个产品表:
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我想你可以试试这个。
只需JOIN
和COUNT
,条件就可以从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