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

时间:2018-09-08 07:17:43

标签: php mysql sql left-join

我有该页面的搜索结果,其中出现了用户搜索过的那些产品。我需要一个查询,该查询将为我提供所有产品类别的计数。

有一些条件:

  1. 一个产品可以具有多个类别。

  2. 有一个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
    
  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 :(得分:1)

从结果和SQL来看,我认为您可以尝试一下。

只需JOINCOUNT,您的条件就可以从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              |

View on DB Fiddle