#1271 - 非法混合操作的排序' UNION'在查询中

时间:2015-11-01 00:20:27

标签: mysql union collation sql-like

我已经检查了每个表的排序规则类型,并且它们具有相同的排序规则。

错误:#1271 - 非法混合操作的排序' UNION'

请参阅以下查询:

$query = "(SELECT id, product_name, description, 'tbl_landt' as type FROM                                      tbl_landt WHERE product_name LIKE '%" . 
          $keyword . "%' OR description LIKE '%" . $keyword ."%') 
           UNION
           (SELECT id, name, null, 'tbl_land_cat' as type FROM tbl_land_cat WHERE name LIKE '%" . $keyword . "%') 
           UNION
           (SELECT tbl_sub_cat.id, tbl_sub_cat.name AS cat_name, null, 'tbl_sub_cat' as type FROM tbl_sub_cat WHERE name LIKE '%" . $keyword . "%')
           UNION
           (SELECT id, name, null, 'tbl_exl_cat' as type FROM tbl_exl_cat WHERE name LIKE '%" . $keyword . "%')";
           $squery = mysql_query($query);

3 个答案:

答案 0 :(得分:5)

要解决此问题,您可能需要使用表达式替换SELECT列表中的一些列引用(在一个或多个查询中),例如 CONVERT(name USING utf8) AS name

最可能的问题是查询返回具有不同字符集的列。 (错误消息标识出有问题的UNION操作,而不是其他比较谓词(WHERE子句中的字符比较,也可能发生此类错误。)

要对此进行调试,您需要检查每个查询中返回的表达式的字符集,并进行比较。要缩小范围,您可以尝试将查询的子集测试为...

(query1) UNION (query2)
(query1) UNION (query3) 
(query1) UNION (query4)

这应该缩小导致问题的组合范围。

然后检查要返回的字符类型列的字符集,作为表/列定义的一部分包含在内。

<强>参考文献:

MySQL CONVERT函数引用:

http://dev.mysql.com/doc/refman/5.6/en/charset-convert.html

显示MySQL中可用的字符集(和排序规则):

SHOW COLLATION

检查查询中引用的列的字符集......

SHOW CREATE TABLE tbl_landt
SHOW CREATE TABLE tbl_land_cat
etc.

另外,请参阅StackOverflow中的这个(旧)问题,以获得有关MySQL中字符串强制性的更详细讨论......

Troubleshooting “Illegal mix of collations” error in mysql https://stackoverflow.com/questions/3029321/troubleshooting-illegal-mix-of-collations-error-in-mysql

答案 1 :(得分:0)

我能够在

失败的CREATE VIEW查询中修复此错误
CAST( COALESCE( <TIMESTAMP> , <DATETIME> ) AS DATETIME

建议here将结果转换为DATETIME,例如:

<div class="row">
        <?php echo $form->labelEx($model,'transport_allowance'); ?>
        <?php echo $form->dropDownList($model,'transport_allowance',array('Car'=>'Car','Others'=>'Others')); ?>
        <?php echo $form->error($model,'transport_allowance'); ?>
    </div>
    <div id="others" style="display:none">
            <div class="row">
                <?php echo $form->labelEx($model,'transport_allowance'); ?>
                <?php echo $form->textField($model,'transport_allowance'); ?>
                <?php echo $form->error($model,'transport_allowance'); ?>
            </div>    
    </div>
    <div id="car" style="display:none">
        <div class="row">
            <?php echo $form->hiddenField($model,'transport_allowance',array('value'=>'450')); ?>
        </div>    
    </div>

<script type="text/javascript">
    $(document).ready(function () {
        $("#Vehicle_transport_allowance").change(function () {
                if ($(this).val() == 'Car') {
                    $('#car').show();
                    $('#others').hide();                    
                } else {
                    $('#others').show();
                    $('#car').hide();
                }
        });
    });
</script>

答案 2 :(得分:-4)

确保列具有相同的数据类型,编码和名称。例如,其中一个联合名称为name,下一个联合语句名为cat_name。确保select中的别名在所有联合中都是相同的。