MYSQL要一系列相同的数据类型才能使用多重排序,如果破防了就可以像我这次一样去用内嵌查询:就能实现对不同数据类型的多次排序

MYSQL要一系列相同的数据类型才能使用多重排序,如果破防了就可以像我这次一样去用内嵌查询:就能实现对不同数据类型的多次排序

    <select id="getPage" resultType="com.wty.models.task.domain.Task">
        <if test="priorityType == true">
            SELECT * FROM (
                </if>

                SELECT

                <include refid="base"/>
                FROM task t
                LEFT JOIN user u ON t.worker_id = u.id
                LEFT JOIN user u2 ON t.captain_id = u2.id
                <where>
                <if test="statusType != null">
                AND t.status = #{statusType}
                </if>
                <if test="sourceType != null">
                AND t.source = #{sourceType}
                </if>

                <if test="delStatusType != null">
                AND t.del_status = #{delStatusType}
                </if>
                <if test="delStatusType == null">
                AND t.del_status = 0
                </if>

                <if test="workerId != null">
                AND t.worker_id = #{workerId}
                </if>
                <if test="captainId != null">
                AND t.captain_id = #{captainId}
                </if>
                <if test="orderId != null">
                AND t.order_id = #{orderId}
                </if>
                <if test="maxTime != null and minTime != null">
                AND t.create_time BETWEEN #{minTime} AND #{maxTime}
                </if>
                <if test="maxTime != null and minTime == null">
                AND t.create_time &lt;= #{maxTime}
                </if>
                <if test="maxTime == null and minTime != null">
                AND t.create_time &gt;= #{minTime} -- 时间排序后再根据优先级排序一次
                </if>
                </where>

                <if test="timeSortType == null or timeSortType == 0">
                ORDER BY t.update_time DESC
                </if>

                <if test="timeSortType == 1">
                ORDER BY t.update_time ASC

                </if>

                LIMIT #{current}, #{size}

                <if test="priorityType == true">
            ) as s ORDER BY s.level DESC
        </if>
    </select>

MySQL是一个常用的关系型数据库管理系统,它被广泛用于各种应用场景中。在实际应用中,我们经常需要对数据库中的数据进行排序。但是,有些开发者可能会遇到一个问题:多字段排序不起作用。

语法上看,多字段排序是非常简单的。比如:

SELECT * FROM my_table ORDER BY column1, column2;

这条语句可以按照列column1和列column2进行排序。但是,有时候我们会发现这种排序不起作用。原因是什么呢?

通常情况下,多字段排序的原理是:先按照第一个字段进行排序,如果有多个值相等,再按照第二个字段进行排序。如果第一个字段的值都相等,才会按照第二个字段排序。依此类推。

但是,如果我们要对多个字段进行排序,那么必须保证这些字段都有相同的数据类型。如果有一个字段的数据类型不同,那么这种多字段排序就不会起作用。

代码示例:

CREATE TABLE my_table(
id INT(11) NOT NULL,
name VARCHAR(255) NOT NULL,
age INT(11) NOT NULL,
PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO my_table(id, name, age) VALUES(1, 'Jack', 25);
INSERT INTO my_table(id, name, age) VALUES(2, 'Tom', 26);
INSERT INTO my_table(id, name, age) VALUES(3, 'Lucy', 23);
INSERT INTO my_table(id, name, age) VALUES(4, 'Mike', 26);
INSERT INTO my_table(id, name, age) VALUES(5, 'John', 25);

考虑以下两种情况:

1.字段age的数据类型是INT,字段name的数据类型是VARCHAR。

-- 这条语句的排序是无效的,将不按照预期的结果排序
SELECT * FROM my_table ORDER BY age, name;

2.字段age的数据类型是VARCHAR,字段name的数据类型是VARCHAR。

-- 这条语句的排序是有效的,将通过age排序,再通过name排序
SELECT * FROM my_table ORDER BY age, name;

总结:

在使用多字段排序时,必须保证所有字段都有相同的数据类型。如果不是,可能会造成排序不起作用。在实际应用中,我们应该仔细检查数据库表的结构,保证字段的数据类型一致,避免出现排序问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值