我有一个像这样的表:
1 2 3 4 5
| name date time
tom | 2011-07-04 | 01: 09: 52
tom | 2011-07-04 | 01: 09: 52
mad | 2011-07-04 | 02: 10: 53
mad | 2009-06-03 | 00: 01: 01 |
我首先要使用最早的名字:
(->无效!)
现在它应该让我先发疯(早点date),然后再发给tom
但使用GROUP BY name ORDER BY date ASC, time ASC首先给我带来了新的生气,因为它在排序之前就进行了分组!
再次:问题是我无法在分组之前按日期和时间排序,因为GROUP BY必须在ORDER BY之前!
- group by与集合函数一起使用,而不是用于排序-您确定正确吗?
-
你有更好的主意吗?我想到了与众不同,但日期和时间也与众不同。
-
如果有某种组合日期和时间列的方法,您实际上只想要名称和每个名称的最早datetime值吗?
-
结果应该是:生气| 2009-06-03 | 00:01:01 / \\\\\\\\汤姆| 2011-07-04 | 01:09:52
-
您的选择没有汇总功能,因此"分组依据"没有任何作用。天蝎座的答案应该起作用...
另一种方法:
GROUP BY会在它匹配的第一个匹配结果上分组。如果第一个匹配项恰好是您想要的匹配项,那么一切都会按预期进行。
我更喜欢这种方法,因为子查询具有逻辑意义,而不是在其他条件下使用它。
-
请注意,不幸的是,这种方法不适用于MariaDB(尽管MariaDB被认为是MySQL的替代品):mariadb.com/kb/en/mariadb/…
-
子查询中似乎缺少FROM。
-
如果子查询返回一个大数据集,那么对于大数据集来说,这确实变得很慢。
-
它没有和我的数据库一起工作。我正在使用mysql 5.7.17
-
在子查询中添加" LIMIT 18446744073709551615"应该可以解决MariaDB上的问题,但这是一个肮脏的解决方案:)
-
@JohnReid它也有问题的失踪:p
-
@ringo上面的查询对Mariadb等效吗?
由于我不允许对user1908688的答案发表评论,因此以下是MariaDB用户的提示:
https://mariadb.com/kb/zh-CN/mariadb/why-is-order-by-in-a-from-subquery-ignored/
-
这正是我一直在寻找的解决方案。谢谢您的消息来源!
-
我很担心这是多么的棘手,但这似乎确实是让它在MariaDB上运行的唯一方法。
-
经过大约两个小时的探索,这才是有效的解决方案。
-
这工作了。真的不喜欢它的外观,但是您能做什么...
-
这是唯一可以正常工作的解决方案。谢谢@Vincent
我认为这就是您要寻找的:
目前,您必须通过STR_TO_DATE来创建一个mysql日期:
所以:
- 我不知道这是否真的是我的问题的答案。它似乎没有随着时间正确排序。您能否检查这里的语法是否正确:($ sql ='SELECT * FROM table GROUP BY name';)$ sql。=" ORDER BY min(STR_TO_DATE(orderDate''orderTime,'%m /%d /% Y%h:%i:%s'))";
-
如果要分组,则不能执行" SELECT *"。更改查询的SELECT部分??。
-
好的,我现在怎么说$ row [" date"]?它没有正确排序...它只是说日期为NULL,并且未排序顺序。
-
我弄错了,您所需的不是%m /%d /%Y,而是%Y-%m-%d。我更新了查询。
-
是的,我认为在我的情况下是%H,因为我有13:05(您可能不知道这一点),但是我仍然获得日期和时间为NULL且没有排序的信息。 PS:您的第一种方法可行,但我确实需要日期和时间。
-
好的,我知道了...:$ sql ='选择名称,日期,时间min(date),min(STR_TO_DATE(time,"%H:%i:%s"))FROM'。$ table;
-
我认为这行不通。无法保证返回的名称列与日期位于同一行。如果这似乎已解决了您的问题,请注意,它很可能不稳定。
-
这不符合OP的要求。 Rob是正确的,返回的结果不是来自同一行。
-
对不起,我很抱歉,但是这个答案是不正确的。 user1908688提供的答案是更好的解决方案。
-
需要取消选择它作为接受的答案。 GROUP BY在ORDER BY之前被处理,这就是首先出现这样的SO问题的全部原因!就像"其他"解决方案所建议的那样,尽管子查询效率不高,但它是实现这项工作的直接而正确的方法。
-
不好意思,不好意思,因为这仅是回答OP的问题,因为他只有两行,所以显然返回的结果看起来还可以。但是,如果您有更多列,则会看到返回的结果不是来自同一行。
-
抱歉,取消选择此作为接受的答案。同时,足够多的人表示user1908688是更正确的答案,如果这个答案有时有效,但并非始终如此,我认为将其作为接受的答案放在最前面是不公平的。
这对我有用:
使用子选择:
为我工作mysql
选择*从(SELECT number,max(date_added)作为datea FROM sms_chat按数字分组)作为按日期排序的datea desc
在Oracle中,这对我有用
解决此问题的另一种方法是使用LEFT JOIN,它可能更有效。我首先从一个仅考虑日期字段的示例开始,因为将日期时间存储在一个datetime列中可能更常见,并且我还希望保持查询简单,以便于理解。
因此,在此特定示例中,如果要基于date列显示最旧的记录,并假设表名名为people,则可以使用以下查询:
LEFT JOIN的作用是,当p.date列为最小值时,在左侧联接上将没有p2.date且其值较小,因此相应的p2.date将为NULL 。因此,通过添加WHERE p2.date is NULL,我们确保仅显示日期最早的记录。
同样,如果要显示最新记录,只需在LEFT JOIN:
中更改比较运算符
现在,对于这个特定的示例,其中日期时间是单独的列,如果要基于合并的两列的日期时间进行查询,则需要以某种方式添加它们,例如:
您可以在"保持某列的分组最大值的行"页面上阅读有关此内容的更多信息(以及其他实现此方法的方法)。
我在这个问题上有一个不同的变体,其中我只有一个DATETIME字段,并且在根据DATETIME字段进行降序排序后,在group by或distinct之后需要一个limit是什么帮助了我:
在这种情况下,如果使用拆分字段,则可以对concat进行排序,那么您可能可以摆脱类似这样的情况:
然后,如果您想限制,则只需将限制语句添加到末尾:
这不是确切的答案,但是对于希望解决在mysql中按组先行排序方法的人们来说,这可能会有所帮助。
当我想找到最新的行(order by date desc,但对于特定的列类型(group by column name)仅获得一个结果时,我来到了该线程。
解决此问题的另一种方法是利用聚合。
因此,我们可以像往常一样运行查询,该查询对asc进行排序并以max(doc) as latest_doc引入新字段,该字段将提供最新日期,并按同一列进行分组。
假设您现在要查找特定列的数据,并且无法完成最大聚合。
通常,要查找特定列的数据,可以使用GROUP_CONCAT aggregator,并使用该列中无法显示的某些唯一分隔符(例如GROUP_CONCAT(string SEPARATOR ' ') as new_column),并且在访问它时,可以拆分/分解new_column字段。
同样,这可能并不对所有人都适用。我做到了,也很喜欢它,因为我写了很少的函数,而且我无法运行子查询。我正在为PHP编写codeigniter框架。
也不确定其复杂性,也许有人可以对此有所了解。
此致:)
-
我猜想,我在这里避开了子查询,只有细微的变化就可以在一个查询中完成工作。如果我碰巧在这里错过了一些东西,请纠正我,再次感谢!
-
不知道为什么它收到了否决票。如果拒绝投票的人可能需要一些时间来解释答案的分歧或错误,那就太好了。