我正在尝试获取关键字匹配的那些产品的所有类别及其数量(该类别中的产品数量).我试过的查询没有给我正确的结果.此外,我希望父类别直到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中找到
我不确定你的意思是:
我还想要父类别直到 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以每个产品为基础,它违背了分组目的LEFT关键字即可MATCH我认为它是正确的条件。