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 <= #{maxTime}
</if>
<if test="maxTime == null and minTime != null">
AND t.create_time >= #{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;
总结:
在使用多字段排序时,必须保证所有字段都有相同的数据类型。如果不是,可能会造成排序不起作用。在实际应用中,我们应该仔细检查数据库表的结构,保证字段的数据类型一致,避免出现排序问题。