eywords = []; if (!empty($keywords_str)) { // 拆分关键词(兼容中文/英文分隔符),并过滤空值 $keywords = preg_split('/[,,、s]+/', $keywords_str, -1, PREG_SPLIT_NO_EMPTY); $keywords = array_filter($keywords); // 防SQL注入:使用帝国CMS自带的转义函数(比addslashes更适配) } // 初始化分组数据(保留原逻辑) $groups_data = [ '录像' => [], '视频' => [], '资讯' => [] ]; // 有关键词时才执行查询(避免空查询) if (!empty($keywords)) { // ========== 优化点1:只构建一次条件,复用计算逻辑 ========== // 构建LIKE条件和相关性分数计算式 $like_conditions = []; $relevance_sum = []; foreach ($keywords as $kw) { $like_conditions[] = "title LIKE '%{$kw}%'"; $relevance_sum[] = "IF(title LIKE '%{$kw}%', 1, 0)"; } $where_like = implode(' OR ', $like_conditions); $relevance_score = implode(' + ', $relevance_sum); // ========== 优化点2:使用CTE(公共表表达式)减少重复扫描表 ========== // 核心:只扫描一次表,计算一次相关性分数,后续子查询复用结果 // ========== 步骤1:创建磁盘临时表(一次扫描、一次计算) ========== $temp_table_sql = " CREATE TEMPORARY TABLE IF NOT EXISTS news_relevance ( id INT, classid INT, title VARCHAR(255), titleurl VARCHAR(255), newstime INT, relevance_score INT, INDEX idx_classid (classid), INDEX idx_relevance (relevance_score) ) AS SELECT id, classid, title, titleurl, newstime, ({$relevance_score}) AS relevance_score FROM {$dbtbpre}ecms_news WHERE ({$where_like}) AND classid IN (2,3,15,16,5,6) -- 提前过滤栏目,减少数据量 "; $empire->query($temp_table_sql); // ========== 步骤2:分3次查询临时表(避免UNION ALL重复引用) ========== $all_rows = []; // 查第一组:录像(2,3,15,16) $group1_sql = "SELECT * FROM news_relevance WHERE classid IN (2,3,15,16) ORDER BY relevance_score DESC, newstime DESC LIMIT 20"; $res1 = $empire->query($group1_sql); while ($row = $empire->fetch($res1)) { $all_rows[] = $row; } $empire->free($res1); // 查第二组:视频(5,6) $group2_sql = "SELECT * FROM news_relevance WHERE classid IN (5,6) ORDER BY relevance_score DESC, newstime DESC LIMIT 20"; $res2 = $empire->query($group2_sql); while ($row = $empire->fetch($res2)) { $all_rows[] = $row; } $empire->free($res2); // 销毁临时表(释放内存,可选但建议加) $empire->query("DROP TEMPORARY TABLE IF EXISTS news_relevance"); // ========== 优化点5:简化分组逻辑,提升可读性 ========== // 预定义栏目组映射(便于后续维护) $classid_group_map = [ 2 => '录像', 3 => '录像', 15 => '录像', 16 => '录像', 5 => '视频', 6 => '视频', ]; // 分组赋值 foreach ($all_rows as $row) { $group_name = $classid_group_map[$row['classid']]; if ($group_name) { $groups_data[$group_name][] = $row; } } } // 预留直播数据容器 ?>

相关资讯

热门专题