Mysql错误:操作'UNION'的非法混合排序

use*_*291 14 mysql

我是Boxonix!

我目前正在为我的网站制作一个评论部分,我有点麻烦!当我运行此查询时,会弹出"非法混合操作'UNION'的排序规则":

SELECT *
FROM comments
JOIN users ON comments.user_id = users.id
ORDER BY users.id DESC LIMIT $LIMIT1
UNION
SELECT *
FROM comments
JOIN videos ON comments.video_id = videos.id
Run Code Online (Sandbox Code Playgroud)

我对alredy有点困惑,我经常不使用Mysql!请帮忙!

Nik*_*car 33

您可以在SELECT查询的一部分中强制进行排序.例如,如果列videos.commentutf8_general_cicomments.comment,utf8_unicode_ci您可以强制它是相同的:

SELECT 
   comment COLLATE utf8_general_ci
FROM comments
UNION
SELECT 
   comment
FROM videos
Run Code Online (Sandbox Code Playgroud)

但是,如果无法根据需要精确翻译排序规则,则此用途有限.


Jos*_*fat 9

为避免"非法混合操作'UNION'"Mysql错误,您必须验证同一索引列具有相同类型的排序规则或编码.


Haj*_*aji 1

您不能在 union 之前使用 order by 语句,如果您想先使用,则必须将结果转换为临时表。然后按条件排序如下

select * from (SELECT * FROM comments
JOIN users ON comments.user_id = users.id
UNION
SELECT * FROM comments
JOIN videos ON comments.video_id = videos.id) as t order by id DESC LIMIT 1
Run Code Online (Sandbox Code Playgroud)

这里重要的注意事项是,用户和视频都应具有与评论表相同的列数。因为如果您使用union或,union all则应采用相同的编号。具有相同数据类型的列..

如果评论、用户、视频具有不同的列数,则用户不要从中选择 *。而是明确选择所有列,如下所示

如果评论表有列 user_id,col1,col2,col3 那么

select user_id,col1,col2,col3 from (SELECT c.user_id,col1,col2,col3 FROM 
comments c JOIN users u c.user_id = u.id
UNION
SELECT c.user_id,col1,col2,col3 FROM comments c
JOIN videos v ON c.video_id = v.id) as t 
order by user_id DESC LIMIT 1
Run Code Online (Sandbox Code Playgroud)