获取所有类别和父类别中的产品都不包含关键字

ank*_*itr 6 mysql sql

我正在尝试获取关键字匹配的那些产品的所有类别及其数量(该类别中的产品数量).我试过的查询没有给我正确的结果.此外,我希望父类别直到1级和他们的计数.

例如,我正在尝试使用关键字手表,那么类别"手表"应该有一些计数.父类别"附件"及其后代类别的总和也计算在内.

我的表结构是:

tblProducts:产品分为5类,fldCategoryId1,fldCategoryId2,fldCategoryId3,fldCategoryId4和fldCategoryId5.fldProductStatus应为'A'

+-----------------------------+-------------------+
| Field                       | Type              |
+-----------------------------+-------------------+
| fldUniqueId                 | bigint(20)        |
| fldCategoryId1              | bigint(20)        |
| fldCategoryId2              | bigint(20)        |
| fldCategoryId3              | bigint(20)        |
| fldCategoryId4              | bigint(20)        |
| fldCategoryId5              | bigint(20)        |
| fldProductStatus            | enum('A','P','D') |
| fldForSearch                | longtext          |
+-----------------------------+-------------------+
Run Code Online (Sandbox Code Playgroud)

tblCategory:

+------------------------------+-----------------------+
| Field                        | Type                  |
+------------------------------+-----------------------+
| fldCategoryId                | bigint(20)            |
| fldCategoryName              | varchar(128)          |
| fldCategoryParent            | int(11)               |
| fldCategoryLevel             | enum('0','1','2','3') |
| fldCategoryActive            | enum('Y','N')         |
+------------------------------+-----------------------+
Run Code Online (Sandbox Code Playgroud)

搜索查询:

SELECT count( c.fldCategoryId ) AS cnt, c.fldCategoryLevel, c.fldCategoryParent, c.fldCategoryId, c.fldCategoryName, p.fldForSearch, c.fldCategoryParent
FROM tblCategory c, tblProducts p
WHERE (
    c.fldCategoryId = p.fldCategoryId1
    OR c.fldCategoryId = p.fldCategoryId2
    OR c.fldCategoryId = p.fldCategoryId3
    OR c.fldCategoryId = p.fldCategoryId4
    OR c.fldCategoryId = p.fldCategoryId5
)
AND p.fldProductStatus = 'A'
AND (
    MATCH ( p.fldForSearch )
    AGAINST (
        '+(watches watch)'
        IN BOOLEAN MODE
    )
)
GROUP BY c.fldCategoryId
Run Code Online (Sandbox Code Playgroud)

注意:该表位于InnoDB引擎中,并且在"fldForSearch"列上具有FULLTEXT搜索索引.

编辑:样本数据可以在sqlfiddle中找到

Seb*_*bas 2

我不确定你的意思是:

我还想要父类别直到 1 级及其计数。

但以下查询将显示每个类别的计数(包括找到 0 个产品的类别)以及一般汇总:

SELECT 
    c.fldCategoryId, 
    c.fldCategoryLevel, 
    c.fldCategoryName, 
    COUNT( * ) AS cnt
FROM tblCategory c
    LEFT JOIN tblProducts p ON
            (c.fldCategoryId = p.fldCategoryId1
        OR  c.fldCategoryId = p.fldCategoryId2
        OR  c.fldCategoryId = p.fldCategoryId3
        OR  c.fldCategoryId = p.fldCategoryId4
        OR  c.fldCategoryId = p.fldCategoryId5)
        AND p.fldProductStatus = 'A'
        AND MATCH ( p.fldForSearch )
            AGAINST (
                '+(watches watch)'
                IN BOOLEAN MODE
            )
GROUP BY 
    c.fldCategoryId
    c.fldCategoryLevel,  
    c.fldCategoryName
WITH ROLLUP;
Run Code Online (Sandbox Code Playgroud)

笔记:

  • p.fldForSearch如果您希望统计该类别中的所有产品,则无法选择。fldForSearch以每个产品为基础,它违背了分组目的
  • 我离开了与产品的连接,因此它返回包含 0 个与您的关键字匹配的产品的类别。如果您不希望发生这种情况,只需删除LEFT关键字即可
  • 我还没有检查过MATCH我认为它是正确的条件。