fix: 修复表查询问题

This commit is contained in:
digua
2026-01-12 00:02:46 +08:00
committed by digua
parent 6d7a205bfa
commit 5372c05c37
2 changed files with 41 additions and 34 deletions

View File

@@ -117,7 +117,7 @@ function buildKeywordCondition(keywords?: string[]): { condition: string; params
const SYSTEM_FILTER = "AND COALESCE(m.account_name, '') != '系统消息'"
// 只获取文本消息的过滤条件
const TEXT_ONLY_FILTER = 'AND msg.type = 0 AND msg.content IS NOT NULL AND msg.content != \'\''
const TEXT_ONLY_FILTER = "AND msg.type = 0 AND msg.content IS NOT NULL AND msg.content != ''"
// ==================== 查询函数 ====================
@@ -127,19 +127,15 @@ const TEXT_ONLY_FILTER = 'AND msg.type = 0 AND msg.content IS NOT NULL AND msg.c
* @param filter 时间过滤器
* @param limit 返回数量限制
*/
export function getRecentMessages(
sessionId: string,
filter?: TimeFilter,
limit: number = 100
): MessagesWithTotal {
export function getRecentMessages(sessionId: string, filter?: TimeFilter, limit: number = 100): MessagesWithTotal {
// 确保数据库有 avatar 字段(兼容旧数据库)
ensureAvatarColumn(sessionId)
const db = openDatabase(sessionId)
if (!db) return { messages: [], total: 0 }
// 构建时间过滤条件
const { clause: timeClause, params: timeParams } = buildTimeFilter(filter)
// 构建时间过滤条件(使用 'msg' 表别名避免多表 JOIN 时的列名歧义)
const { clause: timeClause, params: timeParams } = buildTimeFilter(filter, 'msg')
const timeCondition = timeClause ? timeClause.replace('WHERE', 'AND') : ''
// 查询总数
@@ -196,19 +192,15 @@ export function getRecentMessages(
* @param filter 时间过滤器
* @param limit 返回数量限制
*/
export function getAllRecentMessages(
sessionId: string,
filter?: TimeFilter,
limit: number = 100
): MessagesWithTotal {
export function getAllRecentMessages(sessionId: string, filter?: TimeFilter, limit: number = 100): MessagesWithTotal {
// 确保数据库有 avatar 字段(兼容旧数据库)
ensureAvatarColumn(sessionId)
const db = openDatabase(sessionId)
if (!db) return { messages: [], total: 0 }
// 构建时间过滤条件
const { clause: timeClause, params: timeParams } = buildTimeFilter(filter)
// 构建时间过滤条件(使用 'msg' 表别名避免多表 JOIN 时的列名歧义)
const { clause: timeClause, params: timeParams } = buildTimeFilter(filter, 'msg')
const timeCondition = timeClause ? timeClause.replace('WHERE', 'AND') : ''
// 查询总数
@@ -286,8 +278,8 @@ export function searchMessages(
keywordParams.push(...keywords.map((k) => `%${k}%`))
}
// 构建时间过滤条件
const { clause: timeClause, params: timeParams } = buildTimeFilter(filter)
// 构建时间过滤条件(使用 'msg' 表别名避免多表 JOIN 时的列名歧义)
const { clause: timeClause, params: timeParams } = buildTimeFilter(filter, 'msg')
const timeCondition = timeClause ? timeClause.replace('WHERE', 'AND') : ''
// 构建发送者筛选条件
@@ -445,8 +437,8 @@ export function getMessagesBefore(
const db = openDatabase(sessionId)
if (!db) return { messages: [], hasMore: false }
// 构建时间过滤条件
const { clause: timeClause, params: timeParams } = buildTimeFilter(filter)
// 构建时间过滤条件(使用 'msg' 表别名避免多表 JOIN 时的列名歧义)
const { clause: timeClause, params: timeParams } = buildTimeFilter(filter, 'msg')
const timeCondition = timeClause ? timeClause.replace('WHERE', 'AND') : ''
// 构建关键词条件
@@ -480,7 +472,9 @@ export function getMessagesBefore(
LIMIT ?
`
const rows = db.prepare(sql).all(beforeId, ...timeParams, ...keywordParams, ...senderParams, limit + 1) as DbMessageRow[]
const rows = db
.prepare(sql)
.all(beforeId, ...timeParams, ...keywordParams, ...senderParams, limit + 1) as DbMessageRow[]
const hasMore = rows.length > limit
const resultRows = hasMore ? rows.slice(0, limit) : rows
@@ -515,8 +509,8 @@ export function getMessagesAfter(
const db = openDatabase(sessionId)
if (!db) return { messages: [], hasMore: false }
// 构建时间过滤条件
const { clause: timeClause, params: timeParams } = buildTimeFilter(filter)
// 构建时间过滤条件(使用 'msg' 表别名避免多表 JOIN 时的列名歧义)
const { clause: timeClause, params: timeParams } = buildTimeFilter(filter, 'msg')
const timeCondition = timeClause ? timeClause.replace('WHERE', 'AND') : ''
// 构建关键词条件
@@ -550,7 +544,9 @@ export function getMessagesAfter(
LIMIT ?
`
const rows = db.prepare(sql).all(afterId, ...timeParams, ...keywordParams, ...senderParams, limit + 1) as DbMessageRow[]
const rows = db
.prepare(sql)
.all(afterId, ...timeParams, ...keywordParams, ...senderParams, limit + 1) as DbMessageRow[]
const hasMore = rows.length > limit
const resultRows = hasMore ? rows.slice(0, limit) : rows
@@ -584,22 +580,30 @@ export function getConversationBetween(
if (!db) return { messages: [], total: 0, member1Name: '', member2Name: '' }
// 获取成员名称
const member1 = db.prepare(`
const member1 = db
.prepare(
`
SELECT COALESCE(group_nickname, account_name, platform_id) as name
FROM member WHERE id = ?
`).get(memberId1) as { name: string } | undefined
`
)
.get(memberId1) as { name: string } | undefined
const member2 = db.prepare(`
const member2 = db
.prepare(
`
SELECT COALESCE(group_nickname, account_name, platform_id) as name
FROM member WHERE id = ?
`).get(memberId2) as { name: string } | undefined
`
)
.get(memberId2) as { name: string } | undefined
if (!member1 || !member2) {
return { messages: [], total: 0, member1Name: '', member2Name: '' }
}
// 构建时间过滤条件
const { clause: timeClause, params: timeParams } = buildTimeFilter(filter)
// 构建时间过滤条件(使用 'msg' 表别名避免多表 JOIN 时的列名歧义)
const { clause: timeClause, params: timeParams } = buildTimeFilter(filter, 'msg')
const timeCondition = timeClause ? timeClause.replace('WHERE', 'AND') : ''
// 查询两人之间的所有消息
@@ -649,4 +653,3 @@ export function getConversationBetween(
member2Name: member2.name,
}
}