我是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
我对alredy有点困惑,我经常不使用Mysql!请帮忙!
答案 0 :(得分:30)
您可以在SELECT
部分查询中强制进行整理。例如,如果列videos.comment
为utf8_general_ci
且comments.comment
为utf8_unicode_ci
,您可以强制它相同:
SELECT
comment COLLATE utf8_general_ci
FROM comments
UNION
SELECT
comment
FROM videos
但是,如果无法完全按照您的意愿翻译排序规则,则此用途有限。
答案 1 :(得分:8)
为了避免"非法混合整理操作' UNION'" Mysql错误您必须验证同一索引列具有相同类型的归类或编码。
答案 2 :(得分:2)
问题是两个子查询将具有不同的列集。
第一个子查询将为您提供comments
中的所有列以及users
中的所有列。第二个子查询将为您提供comments
中的所有列以及videos
中的所有列。除非两个表users
和videos
具有完全相同的列定义,否则UNION
将不起作用。
您需要确定每个查询所需的列,然后自定义每个SELECT ...
以使它们匹配。
答案 3 :(得分:1)
您不能在联合之前使用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
这里的重要注意事项是,用户和视频的列数应与评论表的列数相同。因为如果您使用union
或union all
,则应使用相同的号码。具有相同数据类型的列..
如果评论,用户,视频的列数不同,则用户不要选择*。而是选择所有列明确如下
如果comments表包含列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
答案 4 :(得分:0)
将$LIMIT1
替换为1
,并在第二次查询后执行ORDER BY
。请尝试:
(SELECT *
FROM comments
JOIN users ON comments.user_id = users.id)
UNION
(SELECT *
FROM comments
JOIN videos ON comments.video_id = videos.id)
ORDER BY id DESC LIMIT 1
注意:联合操作要求您的两个查询中的每个查询在其结果集中具有完全相同的列数。
答案 5 :(得分:0)
您只需比较所有表的排序规则列,并且所有表中的排序规则列都应相同。例如,如果有utf8_general_ci,则要与联合合并的所有表都应具有utf8_general_ci,或者如果不同,则将其从结构或使用以下查询。
ALTER TABLE
`Tablename`
CHANGE
`columnname`
`columnname` VARCHAR(191)
CHARACTER SET
utf8
COLLATE
utf8_general_ci
NULL
DEFAULT NULL;