HSQLDB如何查询分类列含多个关键词(AND逻辑)的关联条目
错误原因
你的原查询逻辑存在本质偏差:WHERE中对category.categoryname叠加的多个LIKE AND条件,要求单条category记录的categoryname字段同时包含所有关键词,但你的测试数据里不存在任何一个categoryname同时带有ye和yd的记录,自然查不出结果。
你实际的需求是:同一个entry关联的多条category记录中,每个指定关键词都至少有1条对应的categoryname能匹配上,属于跨记录的AND匹配,不能直接在单行判断里写多个LIKE AND。
适配HSQLDB的正确写法
以下语句可以在LibreOffice Base的默认HSQLDB引擎下直接运行,针对你提供的测试数据会正确返回entryid=1的条目:
SELECT entry.* FROM entry INNER JOIN category ON entry.entryid = category.entryid WHERE category.categoryname LIKE '%ye%' OR category.categoryname LIKE '%yd%' GROUP BY entry.entryid, entry.title, entry.datecreated HAVING SUM(CASE WHEN category.categoryname LIKE '%ye%' THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN category.categoryname LIKE '%yd%' THEN 1 ELSE 0 END) > 0;
逻辑说明
- 先用
OR条件捞取所有匹配任意一个目标关键词的category关联记录,避免遗漏命中单个关键词的条目 - 按entry的唯一标识和其他字段分组,把同一个entry关联的所有符合初筛条件的category记录聚合到同一组
- 用
SUM(CASE...)分别统计每个关键词在当前entry关联的category中是否有匹配记录,两个关键词都有匹配(统计值大于0)时,才会返回对应的entry条目
扩展方法
后续如果需要匹配更多关键词,只需要做两处调整:
- 在WHERE子句中追加对应关键词的
OR category.categoryname LIKE '%关键词%'条件 - 在HAVING子句中追加对应关键词的
AND SUM(CASE WHEN category.categoryname LIKE '%关键词%' THEN 1 ELSE 0 END) > 0判断 - 不建议继续使用原写法中的隐式连表(
FROM entry,category WHERE 连表条件),显式写INNER JOIN的逻辑更清晰,也能避免出现笛卡尔积等低级错误。
内容的提问来源于stack exchange,提问作者l1z4rd
相关产品推荐
相关产品推荐

