mysql 几种排序_Mysql ORDER BY或MAX()用于几个表字段的排序?

我混淆了MySQL查询的奇怪行为.我有下一个mysql查询:

SELECT 'username','status', 'field_1', 'field_2', 'field_3', 'field_4',

FROM my_table

ORDER by field_1 DESC, field_2 DESC, field_3 DESC, field_4 DESC

LIMIT 0,10

根据这个想法,它必须按降序方式排序10行,具体取决于ORDER BY条件中字段的数量.但结果我得到了下一个:

凯特103

皮特101

史蒂夫102

代替

凯特103

史蒂夫102

皮特101

有谁知道为什么它设置错误的顺序?如何做出正确的ORDER BY DESC条件?

是否可以将MAX()用于多个字段?如果是,也许有可能像这样组织MySQL查询?

SELECT 'username','status', 'field_1', 'field_2', 'field_3', 'field_4', MAX(field_1,field_2,field_3,field_4) AS total

FROM my_table

ORDER by total DESC

LIMIT 0,10

解决方法:

您不能使用MAX(),因为该函数在多行中返回一列中的最大值.但是你可以使用MySQL的GREATEST()功能.这将返回其中最大的参数,这些参数都来自一行.

SELECT `username`, `status`, GREATEST(field_1,field_2,field_3,field_4) AS field_greatest

FROM my_table

ORDER BY field_greatest DESC

LIMIT 0,10

但是我也会通过存储多个应该是相同“类型”数据的列来评论您违反了1st Normal Form.这称为重复组.结果是你遇到了这个棘手的问题.此外,当您添加第五个字段时,您还需要重写所有查询.

而是创建第二个表并将所有“字段”存储在单个列中,并引用该用户.然后你可以加入表格:

SELECT t.username, t.status, f.field

FROM my_table AS t

LEFT OUTER JOIN (SELECT username, MAX(field) AS field FROM my_fields GROUP BY username) AS f

ON t.username = f.username

ORDER BY f.field DESC

LIMIT 0,10

或者我最喜欢的方法是获得每组最大价值的行:

SELECT t.username, t.status, f1.field

FROM my_table AS t

JOIN my_fields AS f1 ON t.username = f1.username

LEFT OUTER JOIN my_fields AS f2 ON t.username = f2.username AND f1.field < f2.field

WHERE f2.username IS NULL

ORDER BY f1.field DESC

LIMIT 0,10

标签:mysql,max,sql-order-by,greatest-n-per-group

来源: https://codeday.me/bug/20190716/1482779.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值