我有该页面的搜索结果,其中出现了用户搜索过的那些产品。我需要一个查询,该查询将为我提供所有产品类别的计数。
有一些条件:
一个产品可以具有多个类别。
有一个PRODUCT表:
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
我用于搜索结果的查询是:
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循环?
谢谢。
答案 0 :(得分:1)
从结果和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 |