gpt4 book ai didi

Mysql ORDER BY 或 MAX() 用于多个表字段排序?

转载 作者:可可西里 更新时间:2023-11-01 07:47:49 29 4
gpt4 key购买 nike

我混淆了 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

按照这个想法,它必须根据 ORDER BY 条件中有多少个值字段以降序方法对 10 行进行排序。但结果我得到了下一个:

凯特 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 ORDER BY 或 MAX() 用于多个表字段排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6270776/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com