mysql多个字段排序和多个搜索条件

本文介绍了一种SQL查询方法,通过两次子查询及合理的排序方式来筛选并展示数据。首次子查询用于过滤具备特定条件的数据,如PARENT_ID为空且AIR_DATE有效;第二次子查询则在此基础上进一步排序,先按播出日期(AIR_DATE)降序,再按热度(HOT)降序显示结果。
1.根据PARENT_ID为空,AIR_DATE不为空,AIR_DATE不等于0000-00-00 00:00:00条件查询;
2.首先按AIR_DATE降序排列;再根据HOT降序排列;

select NAME,  AIR_DATE, HOT from ( select NAME, AIR_DATE, HOT from CONTENT_INFO where PARENT_ID is null and AIR_DATE is not null and AIR_DATE <> '0000-00-00 00:00:00' order by AIR_DATE desc) as c order by c.HOT desc
MySQL 中,可以过 `ORDER BY` 子句对多个字段进行排序,支持升序(`ASC`)或降序(`DESC`)。以下是具体用法示例: --- ### **基本语法** ```sql SELECT * FROM 表名 ORDER BY 字段1 排序方式, 字段2 排序方式, ...; ``` - 可以指定每个字段排序方式(`ASC` 或 `DESC`),默认是 `ASC`(升序)。 - 排序优先级从左到右依次降低。 --- ### **示例** 假设有一个 `employees` 表,包含以下字段: - `name`(文字,员工姓名) - `age`(数字,年龄) - `salary`(数字,工资) - `department`(文字,部门) #### **1. 单字段排序** ```sql -- 按姓名升序排序 SELECT * FROM employees ORDER BY name ASC; -- 按工资降序排序 SELECT * FROM employees ORDER BY salary DESC; ``` #### **2. 多字段排序** ```sql -- 先按部门升序,再按工资降序 SELECT * FROM employees ORDER BY department ASC, salary DESC; -- 先按年龄降序,再按姓名升序 SELECT * FROM employees ORDER BY age DESC, name ASC; ``` #### **3. 混合排序(数字 + 文字)** ```sql -- 先按工资降序,再按姓名升序 SELECT * FROM employees ORDER BY salary DESC, name ASC; ``` #### **4. 使用表达式排序** ```sql -- 按工资的绝对值升序排序 SELECT * FROM employees ORDER BY ABS(salary) ASC; -- 按姓名长度排序 SELECT * FROM employees ORDER BY LENGTH(name) DESC; ``` #### **5. 中文字段排序** 如果字段是中文,可以结合 `CONVERT` 或 `COLLATE` 按拼音排序: ```sql -- 按中文姓名拼音升序 SELECT * FROM employees ORDER BY CONVERT(name USING gb2312) ASC; -- 或使用 COLLATE(MySQL 8.0+) SELECT * FROM employees ORDER BY name COLLATE utf8mb4_zh_0900_as_cs ASC; ``` --- ### **注意事项** 1. **排序优先级**:`ORDER BY` 后的字段顺序决定排序优先级。例如: ```sql ORDER BY department ASC, salary DESC ``` 先按 `department` 分组排序,再在每个部门内按 `salary` 排序。 2. **NULL 值处理**:默认情况下,`NULL` 值在升序排序时排在最后,降序时排在最前。可以用 `IS NULL` 单独处理: ```sql SELECT * FROM employees ORDER BY department IS NULL, department ASC; ``` 3. **性能优化**:对排序字段建立索引可以提高查询效率,尤其是大数据量表。 --- ### **动态排序(应用层控制)** 如果需要动态指定排序字段顺序(例如从前端传递参数),可以使用预处理语句防止 SQL 注入: ```python # Python 示例(使用 pymysql) sort_field = "salary" # 动态字段 sort_order = "DESC" # 动态顺序 query = "SELECT * FROM employees ORDER BY %s %s" % (sort_field, sort_order) cursor.execute(query) ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值