1271 mysql_使用UNION ALL进行MySQL查询会产生错误1271

本文探讨了在使用SQL语句时遇到的错误:1271-非法混合的操作“联盟”的排序规则及1221-不正确的使用UNION和ORDER BY。通过调整SQL查询结构,成功解决了从多个表中联合检索数据并按时间戳排序的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我有各种表格用于存储具有相同结构的网站各个部分的评论。我想调整管理面板上的评论,但我无法为每个页面做一个页面,所以我想选择它并限制它。我问在这里如何做到这一点,他们解决了我的问题,但我得到的错误:1271 - 非法混合的操作“联盟”的排序规则。

SELECT *

FROM (

SELECT *

FROM (

SELECT *

FROM noticias_comentarios

ORDER BY

ts_creado DESC

LIMIT 10

) q

UNION ALL

SELECT *

FROM (

SELECT *

FROM carruseles_comentarios

ORDER BY

ts_creado DESC

LIMIT 10

) q

) q

JOIN usuarios u

ON u.id = q.id_usuario

ORDER BY

ts_creado DESC

LIMIT 0, 10所有3个表都具有字符集utf8和排序规则utf8_spanish_ci。

我该如何解决它?

先谢谢你。

用拉里的回答进行了更新:

SELECT *

FROM (

SELECT id, id_noticia, id_usuario, comentario, ts_creado

FROM noticias_comentarios

ORDER BY ts_creado DESC

LIMIT 0, 10

UNION ALL

SELECT id, id_carrusel, id_usuario, comentario, ts_creado

FROM carruseles_comentarios

ORDER BY ts_creado DESC

LIMIT 0, 10

) q

JOIN usuarios u ON u.id = q.id_usuario

ORDER BY ts_creado DESC

LIMIT 0, 10现在产生错误:1221 - 不正确的使用UNION和ORDER BY

### 如何在 MySQL 中结合使用 EXISTS 和 UNION ALL #### 使用 EXISTS 进行子查询 `EXISTS` 是一种用于检测是否存在符合条件的记录的关键字。当 `EXISTS` 子查询返回至少一条记录时,外部查询条件为真;否则为假。 ```sql SELECT column_name(s) FROM table1 t1 WHERE EXISTS ( SELECT 1 FROM table2 t2 WHERE t1.id = t2.t1_id); ``` 此代码片段展示了如何通过 `EXISTS` 来筛选那些在 `table2` 中存在关联记录的 `table1` 行[^1]。 #### 使用 UNION ALL 组合多个结果集 `UNION ALL` 可以用来组合两个或更多的 `SELECT` 查询的结果集合,并且不会去除重复项。这使得它比普通的 `UNION` 更高效,因为不需要执行去重操作。 ```sql SELECT column_name(s) FROM table_a UNION ALL SELECT column_name(s) FROM table_b; ``` 这段 SQL 显示了怎样利用 `UNION ALL` 把来自不同表格的数据合并在一起而不做任何过滤处理。 #### 结合 EXISTS 和 UNION ALL 的例子 下面的例子说明了如何在一个复杂的查询中同时运用这两个特性: 假设有一个订单表 (`orders`) 和客户表 (`customers`) ,现在想要获取所有有未完成订单(`status='pending'`) 或者在过去一年内有过交易记录的客户的姓名列表。 ```sql -- 获取具有未完成订单的客户名单 SELECT c.customer_name FROM customers c WHERE EXISTS ( SELECT 1 FROM orders o WHERE o.status = 'pending' AND o.customer_id = c.customer_id) UNION ALL -- 添加过去一年中有过购买行为但当前无待处理订单的顾客 SELECT DISTINCT c.customer_name FROM customers c JOIN orders o ON c.customer_id = o.customer_id WHERE o.order_date >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR) AND NOT EXISTS( SELECT 1 FROM orders oo WHERE oo.status = 'pending' AND oo.customer_id = c.customer_id); ``` 上述查询首先找到拥有状态为 "pending" 订单的所有客户,接着再加入那些最近一年内下过单但是目前没有任何挂起订单的人群。注意这里用了两次不同的方式来应用 `EXISTS`:一次是在主查询里直接作为过滤条件的一部分,另一次则嵌套于另一个 `NOT EXISTS` 子句之中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值