MySQL中SELECT结果集新增自定义行的实现方法
问题解答
报错原因
- 你代码中通过子查询定义的
DBusers属于派生表,是MySQL在查询过程中临时生成的只读结果集,不支持直接执行INSERT写入操作,语法本身不合法。 - 你原本的写法将ORDER BY放在子查询内部,对于UNION合并的场景来说,子查询内的ORDER BY如果没有搭配LIMIT会被优化器忽略,无法实现全局排序的需求。
实现方案
方案1:直接用UNION ALL合并结果(无需建临时表,推荐)
无需额外创建临时表,直接合并两个查询的结果即可,注意UNION ALL要求前后两个查询返回的列数、列类型必须一致,所以第二个查询要补全contact_value字段的空值,排序规则放在整个语句末尾作用于合并后的所有数据:
SELECT goldusers_user_ci.user_id, goldusers_users.username, goldusers_user_ci.contact_value FROM goldusers_users INNER JOIN goldusers_user_ci ON goldusers_users.id = goldusers_user_ci.user_id UNION ALL SELECT -1 as user_id, "All" as username, "" as contact_value ORDER BY user_id
方案2:显式创建可写临时表(适合后续需要多次操作该数据集的场景)
如果你确实需要生成可写入、可重复查询的临时表,可以用CREATE TEMPORARY TABLE ... SELECT语法先建表再插入:
-- 创建临时表并导入初始查询结果 CREATE TEMPORARY TABLE DBusers SELECT goldusers_user_ci.user_id, goldusers_users.username, goldusers_user_ci.contact_value FROM goldusers_users INNER JOIN goldusers_user_ci ON goldusers_users.id = goldusers_user_ci.user_id; -- 插入额外行 INSERT INTO DBusers(user_id,username,contact_value) VALUES(-1,"All",""); -- 查询排序后的结果 SELECT * FROM DBusers ORDER BY user_id;
注:临时表仅在当前数据库会话中生效,会话关闭后会自动删除,不会占用持久化存储资源。
内容的提问来源于stack exchange,提问作者marksy95
相关产品推荐
相关产品推荐

