Mysql ORDER BY 或 MAX() 用于几个表字段排序?
Posted
技术标签:
【中文标题】Mysql ORDER BY 或 MAX() 用于几个表字段排序?【英文标题】:Mysql ORDER BY or MAX() for several table fields orderring? 【发布时间】:2011-09-10 09:02:45 【问题描述】:我混淆了 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
【问题讨论】:
你的问题毫无意义。当您的选择中只有两列(这两列都不包含单词“field”,顺便说一句)时,您不能按 field_1、field_2、field_3 和 field_4 排序。如果您需要查询方面的帮助,请发布更真实的 SQL 来证明您的问题。 @KenWhite 对不起!忘了提到我在选择中按字段排序。很着急,所以也忘了在 SELECT 字段上指出它们。 【参考方案1】:您不能将多个值输入最大值。不过你可以做一些嵌套的IF()
。
SELECT `username`,`status`,
MAX(
if( field_1 > field_2 and field_1 > field_3 and field_1 > field_4 ,field_1,
if( field_2 > field_3 and field_2 > field_4 ,field_2,
if( field_3 > field_4, field_3, field_4 )))) AS total
FROM my_table
ORDER by total DESC
LIMIT 0,10
【讨论】:
为什么 ORDER BY 条件在这种情况下不起作用?你的例子工作得快还是慢?我在一个表中有大约 5,000 行。如果将您的示例与 MAX() 一起使用,它会对 MySQL 服务器造成额外的负载吗?谢谢 @ilnur777,你有数据库,所以测试一下它运行的快/慢。我猜它会在所有这些测试中运行缓慢。【参考方案2】:您不能使用MAX()
,因为该函数返回多行one 列中的最大值。但是你可以使用 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
【讨论】:
感谢您的帮助! GREATEST() 函数非常适合这种情况并且运行速度很快。这就是我需要的东西。 =)以上是关于Mysql ORDER BY 或 MAX() 用于几个表字段排序?的主要内容,如果未能解决你的问题,请参考以下文章
MySQL进阶5--分组排序和分组查询 group by(having) /order by
不能在 Group by/Order by/Where/ON 子句中使用 Group 或 Aggregate 函数(min()、max()、sum()、count()、...等)