You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 07:57:27