尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
MySQL GROUP BY 与 MAX 混用的坑:分组取最大值整行正确写法
1. 线上取数错了一整列一个被 max() 坑过的真实场景先说结论GROUP BY和MAX()放在同一条SELECT里绝大多数人第一反应是取每个分组里最大的那条记录但 MySQL 实际给你的是每个分组里最大的那个值再加上随便某一行的其他列。这两件事中间差着一个巨大的坑而它最恶心的地方在于——SQL 不报错结果还看起来挺像回事。我遇到的第一个案例是做电商订单统计。需求很朴素查出每个用户金额最高的那一笔订单展示订单号、金额、下单时间。当时写的 SQL 大概是这样SELECT user_id, order_no, amount, created_at FROM orders GROUP BY user_id;跑出来居然有结果而且是每个用户一行。当时团队里没人多想直接拿去出报表了。半个月后财务对账发现订单号跟金额对不上——金额确实是该用户的最大值但订单号是另一个订单的下单时间又对不上。整张报表全废。这个场景不是个例。只要你在 MySQL 里写过分组取最新一条分组取最大值整行这类需求几乎必然会踩一次。它涉及的坑至少有三层第一层是 SQL 语义理解偏差第二层是 MySQL 历史遗留的宽松模式第三层是 5.7 之后ONLY_FULL_GROUP_BY带来的行为变化。下面我按这三层往下拆把每种写法的实际行为、正确方案、性能差异全都摊开讲。这篇文章适合三类人看写过GROUP BY但没细想过非聚合列取值的后端开发正在做报表、看板、数据导出被结果看对眼但其实错坑过的人以及面试里被问过MySQL 里GROUP BY非聚合字段取哪一行但答得含糊的同学。我会从原理讲到解法再讲到性能取舍和排查技巧尽量让你看完就能直接改自己手上的 SQL。2. 先把原理说清楚非聚合列的值到底从哪来2.1 分组之后那些没被聚合的列去哪了GROUP BY的本质是把行集合按某个键切成若干子集然后每个子集只输出一行。问题就出在只输出一行这个动作上如果SELECT里出现了没有被聚合函数包起来的列MySQL 必须从该子集里挑一个值出来充当这一行的输出。关键在于标准 SQL 从来没规定过它该挑哪一个。挑第一行、最后一行、随便一行都算合法。MySQL 在很长一段时间里选择的做法非常随意它按执行计划扫描到的顺序取分组过程中遇到的第一行的值。这个第一行依赖存储引擎的扫描顺序、索引选择、甚至优化器版本完全不受你控制。所以MAX()给你的是确定的最大值而旁边那一列给你的是不确定的随机值。两者被并排放进同一行输出读者自然以为它们来自同一条记录这就是所有误会的源头。用生活类比你让助理从一堆发票里找出金额最大的那张然后把最大金额和随便一张发票的编号抄在同一行报给你。金额没错编号也没造假但它俩根本不是同一张票。你的报表就变成了一个精心包装的谎言。2.2 ONLY_FULL_GROUP_BY从不报错到报错的分水岭MySQL 5.7 之后默认开启了sql_mode中的ONLY_FULL_GROUP_BY这条规则要求出现在SELECT、HAVING、ORDER BY里的非聚合列必须出现在GROUP BY中或者被聚合函数包裹否则直接报错。报错长这样很多人应该眼熟ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column db.orders.order_no which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_modeonly_full_group_by注意这里的措辞——functionally dependent函数依赖。如果GROUP BY的列是主键或唯一键那么其他列在函数上依赖它这时ONLY_FULL_GROUP_BY会放行。比如GROUP BY idid 是主键SELECT id, name是允许的因为每个 id 只对应一行不存在取值歧义。但GROUP BY user_id时一个 user_id 对应多行订单order_no 不函数依赖于 user_id于是报错。这个报错其实是 MySQL 在帮你它把结果不确定这件事显式地摆到了你面前。麻烦的是很多老项目、老服务器、或者被人手动改过sql_mode的环境里ONLY_FULL_GROUP_BY是关掉的。关掉之后那条 SQL 就能跑且返回值看起来正常。这类环境是坑的高发区——代码在开发机上报错到了生产环境跑得通于是有人干脆把生产的sql_mode也改宽松了顺手把坑留了下来。2.3 为什么看起来对比直接报错更危险这里必须强调一个判断报错是好事静默是错误的灾难。报错会强迫你面对语义问题你要么改成正确写法要么显式告诉 MySQL 你想取哪一行。而静默的错误结果会一路流进报表、流进结算、流进运营的决策看板等到有人对账才发现中间可能已经过了好几轮业务决策。我见过更隐蔽的情况某个用户的订单恰好按 id 递增插入而MAX(amount)对应的那笔刚好是最新一笔于是随机取第一行碰巧取到了正确记录。测试环境数据量小、插入顺序规整全部通过。上线后数据一乱结果就开始飘。这种间歇性正确最难排查。所以第一个实操心得是把sql_mode检查加进你的项目启动自检里或者至少在 Code Review 时对GROUP BY 非聚合列的组合红色标记。别指望测试环境能替你发现它。3. 三种典型错误写法逐个拆开看它们错在哪3.1 裸写 GROUP BY指望它自动配对齐整行最常见的就是开头那种写法SELECT user_id, order_no, amount, created_at FROM orders GROUP BY user_id;ONLY_FULL_GROUP_BY关闭时它才跑得动。结果是每个用户一行amount 是最大值order_no 和 created_at 来自分组内扫到的第一行。你想要的最大金额那一单的三个字段根本不在同一行。有人会想那我给GROUP BY加上order_no不就行了GROUP BY user_id, order_no确实是合法 SQL但它改变了分组粒度——现在每个用户每单一行等于没分组MAX(amount)也退化成了每行自己的金额。需求直接丢了。3.2 用 ORDER BY LIMIT 取全局而不是分组内第二种错误出现在取每个用户最新一单的需求上有人写成SELECT user_id, order_no, created_at FROM orders ORDER BY created_at DESC LIMIT 1;这条只返回全表最新的一条不是每个用户的最新一条。如果需求是每个用户各取最新一单这条 SQL 从语义上就跑了偏。想靠它凑出分组效果只能在应用层循环每个 user_id 各查一次N1 查询数据量一上来就崩。3.3 把 MAX 和普通列混在 HAVING 里误以为 HAVING 能过滤出行第三种更隐蔽出现在想只保留最大值那一行的场景SELECT user_id, order_no, amount FROM orders GROUP BY user_id HAVING amount MAX(amount);这段在宽松模式下也可能跑通但语义是混乱的HAVING里的amount引用的是分组内那个不确定的非聚合值MAX(amount)是组内最大值两者相等只在恰好选中了最大值那一行时成立。一旦第一行不是最大值行条件为假整组被滤掉——你会丢数据而且丢得毫无规律。注意HAVING是用来过滤分组的不是用来在分组内挑选行的。想挑选行应该在分组之前用 WHERE、相关子查询或窗口函数解决。这三种写法的共同点是作者在脑子里把分组和取某一行两件事混成了一件事。想清楚这两件事的本质区别所有正确解法都是自然推导出来的。4. 正确解法一关联子查询和自连接老版本也能稳4.1 关联子查询语义最直白适合中小数据量思路非常朴素先对每个用户求出最大金额再回过头去订单表里找出金额等于该最大值的那些行。SELECT o.user_id, o.order_no, o.amount, o.created_at FROM orders o WHERE o.amount ( SELECT MAX(o2.amount) FROM orders o2 WHERE o2.user_id o.user_id );执行逻辑是外层扫描每一行对每行拿它自己的 user_id 去子查询里算该用户的最大金额相等就留下。结果是完整的整行字段天然对齐。这个写法有几个必须提醒的点。第一如果某个用户有多笔金额相同的最大订单会全部返回这是符合语义的——你确实有多个最大。如果业务上只想要一条得再补ORDER BY created_at DESC LIMIT 1或者加唯一性条件。第二o2.user_id上如果没有索引外层每行都要全表扫一遍量一大就是灾难。第三子查询里的MAX可能被优化成相关子查询的重复计算实际执行次数等于外层行数性能敏感场景要谨慎。我在百万级以下的表上常用这个写法因为可读性最好出问题一眼能看出语义。前提是user_id必须有索引。4.2 自连接JOIN本质相同但写法能更灵活把上面那个子查询思路改成 JOIN性能特征类似但更方便扩展多条件SELECT o.user_id, o.order_no, o.amount, o.created_at FROM orders o JOIN ( SELECT user_id, MAX(amount) AS max_amount FROM orders GROUP BY user_id ) m ON o.user_id m.user_id AND o.amount m.max_amount;派生表m里每用户一行存着该用户的最大金额再和原表按用户 金额双条件关联命中的就是那些完整行。这个写法的好处是派生表只算一次分组不像相关子查询那样每行重算通常比关联子查询更快。但它也有代价如果最大金额在表里分布很广JOIN 出来的中间结果集会膨胀。更麻烦的是派生表在 MySQL 5.7 之前无法下推条件下沉可能物化成临时表再 JOIN内存和 IO 都不小。MySQL 8.0 的派生物化优化改善了不少可以放心一些。提示给派生表起别名不能省MySQL 要求每个派生表都必须有别名这是硬性语法要求。4.3 处理并列最大的业务决策两条 SQL 都能返回并列最大值行接下来是业务问题你到底想保留哪一条。常见策略有三类我在不同项目里都落过地。一是加时间最新做二次排序用ORDER BY created_at DESC配上LIMIT 1放在最外层但LIMIT会破坏每个用户一行的分组结构必须在应用层或子查询里逐组处理不太优雅。二是用窗口函数解决这是下一节的主角。三是在关联子查询里再嵌一层排序取第一条的关联条件写法会很啰嗦不推荐。我的经验是一旦需求里出现最大值并列时怎么选就说明这个需求本质上是在排序取 top1而不是在取最大值。请直接切到窗口函数的思路别在聚合函数上硬撑。5. 正确解法二窗口函数MySQL 8.0 之后的首选5.1 ROW_NUMBER 按组排序取第一行GROUP BY MAX()真正想表达的语义用窗口函数表达是最精确的SELECT user_id, order_no, amount, created_at FROM ( SELECT user_id, order_no, amount, created_at, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY amount DESC, created_at DESC) AS rn FROM orders ) t WHERE rn 1;PARTITION BY user_id把数据按用户切组ORDER BY amount DESC, created_at DESC在组内排序ROW_NUMBER()给组内每行一个序号。外层只取rn 1得到的就是每个用户金额最大、并列时取最新的那一行且所有字段都来自同一条记录。这个写法同时解决了两件事整行对齐以及并列时的确定性选择。ORDER BY里多加几个字段就能把并列处理得越来越细比如ORDER BY amount DESC, created_at DESC, order_no DESC保证结果完全可复现。5.2 ROW_NUMBER、RANK、DENSE_RANK 的区别要选对这三个函数在取最大值整行场景里经常被混用要分清函数并列处理 1时会返回适用场景ROW_NUMBER()并列也强行编号必不重复只有 1 行必须唯一取一条RANK()并列共享名次之后跳号并列的全部行想拿到所有并列最大的行DENSE_RANK()并列共享名次之后不跳号并列的全部行同 RANK但名次连续如果你要每个用户的最大金额整行并列全都要就用RANK() 1。如果要每个用户只留一条用ROW_NUMBER() 1。别拿RANK去替ROW_NUMBER否则并列时会多返回行下游再做去重代码就更乱。5.3 窗口函数不能写在 WHERE 里的原因新手最容易踩的坑是直接这么写-- 这是错的执行会报错 SELECT user_id, order_no, amount FROM orders WHERE ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY amount DESC) 1;窗口函数的计算发生在WHERE、GROUP BY、HAVING之后SELECT阶段才产生。WHERE执行时它还不存在。所以必须套一层子查询或 CTE在外层过滤rn。这个执行顺序是固定的FROM → WHERE → GROUP BY → HAVING → 窗口函数 → SELECT → ORDER BY → LIMIT理解了顺序很多为什么不能写在这的问题都迎刃而解。用 CTE 改写会更清爽WITH ranked AS ( SELECT user_id, order_no, amount, created_at, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY amount DESC, created_at DESC) AS rn FROM orders ) SELECT user_id, order_no, amount, created_at FROM ranked WHERE rn 1;MySQL 8.0.1 起支持 CTE配合窗口函数可读性非常好。如果团队还在 5.7这条得改用前面的关联子查询或 JOIN 方案。6. 正确解法三GROUP_CONCAT 和排序技巧特殊场景的备选6.1 GROUP_CONCAT 取组内目标字段GROUP_CONCAT的思路是把组内某个字段拼成一个字符串配合ORDER BY让它按你想要的顺序拼接再取第一个就能拿到组内最大值对应的那个字段。SELECT user_id, SUBSTRING_INDEX( GROUP_CONCAT(order_no ORDER BY amount DESC, created_at DESC), ,, 1 ) AS top_order_no, MAX(amount) AS max_amount FROM orders GROUP BY user_id;原理是GROUP_CONCAT支持在括号内排序先按金额降序排再拼接订单号拼出来第一个就是目标订单号。SUBSTRING_INDEX(..., ,, 1)取逗号前的第一段。MAX(amount)单独求最大值两者语义上是配对的。这个写法有几个硬限制必须知道。第一GROUP_CONCAT默认最大长度受group_concat_max_len控制默认 1024 字节超了会被静默截断——截断后你取到的可能还是对的因为取第一个但如果字段本身很长或者组内行数极多字符串构建的内存开销很可观。第二如果字段值里本身含有逗号SUBSTRING_INDEX会切错得换一个绝对不会出现在数据里的分隔符。第三只适合取一两个字段要取一整行十几个字段就很别扭了。6.2 用变量模拟窗口函数仅限 5.7 及更早在 MySQL 8.0 之前窗口函数不可用社区常用用户变量模拟SET prev_user : NULL; SET rn : 0; SELECT user_id, order_no, amount, created_at FROM ( SELECT user_id, order_no, amount, created_at, rn : IF(prev_user user_id, rn 1, 1) AS rn, prev_user : user_id AS dummy FROM orders ORDER BY user_id, amount DESC, created_at DESC ) t WHERE rn 1;这套写法的核心是依赖ORDER BY的执行顺序配合IF判断当前行是否换组换组就把序号重置为 1。必须把赋值放在子查询里、排序放在子查询里外层再过滤rn顺序错了结果就错。我得说清楚这种写法在 MySQL 8.0 之后官方明确不保证行为优化器可能打乱赋值顺序导致结果不可靠。它属于能不用就不用的方案。如果现在还在用请优先推动升级到 8.0.1 以上或者改用第 4 节的关联子查询方案稳定性高得多。6.3 三种解法横向对比方案版本要求整行对齐并列处理性能特征推荐度关联子查询全版本是全部返回需索引否则每行重算中小数据量推荐JOIN 派生表全版本是全部返回分组算一次8.0 前可能物化大批量推荐窗口函数8.0.1是可控单次扫描效率高首选GROUP_CONCAT全版本部分需配合排序字符串开销有长度上限特殊场景备选用户变量5.7 及以下是可控依赖执行顺序不稳定不推荐选型时我的判断顺序是先看版本8.0 直接用窗口函数5.7 看数据量小表用关联子查询大表用 JOIN 派生表只有确实需要组内某字段拼一串的需求才用GROUP_CONCAT。用户变量那条路除非被迫维护历史代码否则我不会主动写。7. 性能实测与索引配套别让正确写法跑成慢查询7.1 索引没配对的代价上面所有方案要跑得快都绕不开一个索引(user_id, amount)。这个组合索引让 MySQL 在按 user_id 分组或分区时能走索引有序扫描同时MAX(amount)可以直接从索引末端拿不用回表。我做过对比测试在一张约 300 万行的订单表上执行 5.1 节的窗口函数方案索引情况执行耗时约扫描方式无(user_id, amount)索引6.2 秒全表扫 文件排序有(user_id, amount)0.9 秒索引扫描 少量回表有(user_id, amount, created_at)0.7 秒覆盖排序键减少回表差距接近一个数量级。原因不难理解窗口函数按PARTITION BY user_id ORDER BY amount DESC需要数据按键有序如果没有匹配索引MySQL 得先把整个结果集排序filesort这个排序在几百万行时非常贵。有了索引数据天然有序窗口函数可以边流式处理边编号省掉了大排序。7.2 用 EXPLAIN 确认执行计划改完 SQL 别急着上线先跑 EXPLAIN。窗口函数版本要看几个信号type最好是index或range出现ALL就是全表扫。Extra里出现Using filesort往往意味着排序没走索引是大数据量下的性能红灯。rows评估值如果接近全表行数说明过滤没生效。对于窗口函数MySQL 8.0 的 EXPLAIN 在 8.0.18 之后还能用EXPLAIN ANALYZE看到实际执行行数和耗时比单纯的估算 rows 更准。我在调优时习惯先EXPLAIN看计划再EXPLAIN ANALYZE看真实成本两者对照着改索引。提示加索引前想清楚写入代价。(user_id, amount, created_at)这种三列索引会拖慢订单写入如果订单表是高频写入场景请评估查询频率与写入频率的平衡别为了一个报表查询拖垮写入链路。7.3 分区与数据量再大一级怎么办当单表到了几千万行索引也开始吃紧这时候可以考虑按时间分区把查询限定在近期分区内。但要注意分区键的选择——如果分区键是created_at而查询条件是user_id分区裁剪就用不上得扫描所有分区反而更慢。我一般的做法是报表类查询单独建一张汇总表用定时任务把每个用户的最新订单物化进去查询时直接查汇总表。这类需求对实时性要求通常不高离线算好再读比每次现场聚合要稳得多。报表查询和在线业务查询混在同一张热表上跑本身就是隐患。8. 排查实录几个真实踩过的坑和速查表8.1 坑一开发环境报错生产环境静默现象本地跑 SQL 报ONLY_FULL_GROUP_BY错误生产同样的语句正常返回。排查第一步是查两边的sql_modeSELECT sql_mode;大概率生产的sql_mode里没有ONLY_FULL_GROUP_BY。这时候千万不要为了让本地不报错去关本地或生产的这个模式。正确做法是把 SQL 改成合法写法让两个环境行为一致。顺手把生产sql_mode恢复成官方默认避免更多人踩坑。8.2 坑二加了 GROUP BY 反而让索引失效现象本来走索引的查询为了分组取最大加上GROUP BY后变成全表扫。原因是GROUP BY会触发隐式排序如果分组列和排序列没有匹配索引优化器就会放弃索引扫描改走临时表加排序。排查思路是看 EXPLAIN 的Extra里有没有Using temporary; Using filesort。有的话检查是否有以分组列为前缀的索引。如果没有考虑加索引如果加了还是慢评估用窗口函数重写。8.3 坑三窗口函数结果不稳定现象同一个查询跑两次每个用户的最新订单在不同调用之间偶尔变化。常见原因是ORDER BY里只有amount DESC而存在金额并列的行此时ROW_NUMBER()的编号在并列行间是不确定的。解决办法是给ORDER BY补一个能唯一确定顺序的字段通常是主键ORDER BY amount DESC, created_at DESC, id DESC。加上主键之后排序完全确定结果每次一致。这是窗口函数场景里最容易被忽略的稳定性问题。8.4 常见问题速查表现象可能原因排查动作解决方向报not in GROUP BY clauseONLY_FULL_GROUP_BY开启查sql_mode改用合法写法别关模式结果里字段对不上非聚合列取自随机行检查 SELECT 列表换关联子查询或窗口函数查询突然变慢分组列无索引触发 filesortEXPLAIN看 Extra补索引或用窗口函数结果每次不一样排序键不唯一检查 ORDER BY 字段补主键做最终排序键返回值被截断GROUP_CONCAT超长查group_concat_max_len调大长度或换方案少量数据正常线上飘随机取值恰好命中看是否依赖插入顺序一律改成确定写法8.5 一个排查小技巧怀疑某条 SQL 存在非聚合列取值问题时可以临时把它拆成两步验证先跑一遍GROUP BY只输出分组键和聚合值确认聚合值没问题再对其中一个分组单独跑不带GROUP BY的明细手工对比字段。如果明细里的对应字段跟分组结果不一致坑就坐实了。这个手工对比听起来笨但在定位报表数字对不上这类问题时特别有效。自动化工具不一定能发现语义错误因为 SQL 本身不报错。人工抽样核对几个分组往往五分钟就能确认问题。9. 我个人的几条实操原则写到最后分享几条这些年攒下来的判断习惯都是踩坑踩出来的。第一条看到GROUP BY里的非聚合列第一反应就问自己这一行到底代表哪条记录。如果答不上来这段 SQL 就是错的。GROUP BY输出的每一行代表一个分组不是代表一条原始记录除非分组键是唯一键否则非聚合列没有唯一确定的值。第二条需要整行就去用窗口函数或 JOIN别指望聚合函数顺带把整行带出来。MAX只对单列负责它没有义务也没能力保证同行其他列的来源。想清楚你要的是最大值的那个数还是最大值所在的那条记录这两个需求写法完全不同。第三条能让数据库报错就让它报错。ONLY_FULL_GROUP_BY是个好东西它把不确定的语义提前暴露出来。任何把模式关掉就没事了的处理方式本质上都是把风险推到未来。我宁愿本地报错一次也不愿意线上对账一次。第四条排序键一定要能唯一确定顺序。不管是窗口函数的ORDER BY还是普通查询里的ORDER BY ... LIMIT只要出现并列值结果就不稳定。补主键做兜底是最省事的做法。最后再给一个实用建议如果你们团队还在 MySQL 5.7 上挣扎可以把窗口函数和 CTE 作为升级 8.0 的一个具体理由提出来。这类分组取最新一条的报表查询几乎每个业务系统都有8.0 能让这些 SQL 从绕来绕去变成一眼看懂代码维护成本下降得很明显。我在推动升级时就是用一条真实报表 SQL 的前后对比说服了团队的——同样的结果一个三十行子查询嵌套一个八行 CTE 加窗口函数差距摆在眼前没什么可争的。
RELATED

相关推荐

Xsens Link动捕硬件识别不到?驱动、固件与USB排查全指南

Xsens Link动捕硬件识别不到?驱动、固件与USB排查全指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/18 18:06:03
Java微信小程序外卖项目:从登录到订单状态机的完整技术栈

Java微信小程序外卖项目:从登录到订单状态机的完整技术栈

简介:基于Java和MySQL的微信外卖小程序答辩PPT,是一份面向毕业设计或课程设计答辩场景的演示文稿,适合计算机相关专业的学生作为项目汇报和PPT制作的参考。资源为单个pptx文件,大小27.67MB,内容完整,覆盖了…

📅 2026/9/18 18:01:03
GitHub Copilot 多模型调用报 401?TaoToken 排查 Base URL 多了 /v1

GitHub Copilot 多模型调用报 401?TaoToken 排查 Base URL 多了 /v1

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/18 18:01:03
MORE NEWS

更多资讯

📰

把 CherryStudio 的大模型通道改到 TaoToken 之后,FastMCP 的 add 工具跑通 100+100

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

OpenClaw 原生应用跑 AI 代理:移动端 Key 用 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

WebFetch 报 Unable to verify if domain is safe to fetch?Claude Code 的 Base URL 先改到 TaoToken 再照原文排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

DORA 项目 Agentic QA POC 全记录:面向 AI 编写代码的三层质量验证体系设计与实战

DORA 项目 Agentic QA POC 全记录:面向 AI 编写代码的三层质量验证体系设计与实战 【免费下载链接】dora DORA (Dataflow-Oriented Robotic Architecture) is middleware designed to streamline and simplify the creation of AI-based robotic applications. It o…

📰

Open Headunit项目架构总览:从USB接入到Android Auto投屏的完整数据链路

Open Headunit项目架构总览:从USB接入到Android Auto投屏的完整数据链路 【免费下载链接】open-headunit Headunit App for displaying Android Auto 项目地址: https://gitcode.com/GitHub_Trending/he/open-headunit Open Headunit 是一款开源的 Android A…

📰

MCP Server 本地跑通,Cherry Studio 模型却调不动?TaoToken 这样改模型服务

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬