【发布时间】:2020-09-04 00:22:53
【问题描述】:
在 rails 4 应用程序中,我试图通过组合多个表来获取一些数据。
SELECT keywords.name, DATE(keyword_histories.created_at) as c, position, keyword_id FROM 'keyword_histories' join keywords on keywords.id = keyword_histories.keyword_id WHERE (keywords.website_id = 3716 and keyword_histories.status = 'finished') AND ('keyword_histories'.'created_at' BETWEEN '2020-03-16 00:00:00' AND '2020-05-15 00:00:00') GROUP BY DATE(keyword_histories.created_at), keyword_histories.keyword_id ORDER BY keywords.name asc, keywords.id asc, keyword_histories.created_at desc, DATE(keyword_histories.created_at) desc;
这个查询的当前输出是(这里取前几行),
+---------+------------+----------+------------+
| name | c | position | keyword_id |
+---------+------------+----------+------------+
| az | 2020-05-08 | 1 | 3360 |
| bags | 2020-05-08 | 100 | 3314 |
| bags | 2020-04-27 | 100 | 3314 |
| bags | 2020-04-09 | 100 | 3314 |
| bags | 2020-04-08 | 100 | 3314 |
| battery | 2020-05-08 | 100 | 3337 |
| battery | 2020-04-27 | 100 | 3337 |
| books | 2020-05-08 | 100 | 3313 |
| books | 2020-04-27 | 100 | 3313 |
| books | 2020-04-09 | 100 | 3313 |
| books | 2020-04-08 | 100 | 3313 |
在为created_at 添加GROUP BY 之前,数据是这样的(c 列已占用时间以便更好地理解),
+---------+---------------------+----------+------------+
| name | c | position | keyword_id |
+---------+---------------------+----------+------------+
| az | 2020-05-08 11:48:01 | 1 | 3360 |
| az | 2020-05-08 10:30:06 | 1 | 3360 |
| bags | 2020-05-08 11:48:01 | 39 | 3314 |
| bags | 2020-05-08 10:30:06 | 45 | 3314 |
| bags | 2020-05-08 10:24:21 | 46 | 3314 |
| bags | 2020-05-08 10:20:16 | 35 | 3314 |
| bags | 2020-05-08 10:03:55 | 100 | 3314 |
| bags | 2020-04-27 12:45:20 | 100 | 3314 |
| bags | 2020-04-09 08:25:20 | 100 | 3314 |
| bags | 2020-04-09 06:45:48 | 100 | 3314 |
| bags | 2020-04-08 06:52:08 | 100 | 3314 |
| battery | 2020-05-08 11:48:01 | 14 | 3337 |
| battery | 2020-05-08 10:30:06 | 14 | 3337 |
| battery | 2020-05-08 10:24:21 | 12 | 3337 |
| battery | 2020-05-08 10:20:17 | 12 | 3337 |
| battery | 2020-05-08 10:03:55 | 100 | 3337 |
| battery | 2020-04-27 12:45:20 | 100 | 3337 |
如果没有GROUP BY,它将按desc 的顺序排序。但我的要求是,即使我为DATE(keyword_histories.created_at) 添加GROUP BY,也应使用keyword_histories.created_at 按降序对数据进行排序。
预期的输出应该是,
* With time, added for just to know the `datetime` to sort
+---------+---------------------+----------+------------+
| name | c | position | keyword_id |
+---------+---------------------+----------+------------+
| az | 2020-05-08 11:48:01 | 1 | 3360 |
| bags | 2020-05-08 11:48:01 | 39 | 3314 |
| bags | 2020-04-27 12:45:20 | 100 | 3314 |
| bags | 2020-04-09 08:25:20 | 100 | 3314 |
| bags | 2020-04-08 06:52:08 | 100 | 3314 |
| battery | 2020-05-08 11:48:01 | 14 | 3337 |
| battery | 2020-04-27 12:45:20 | 100 | 3337 |
* Without time, exact output required.
+---------+------------+----------+------------+
| name | c | position | keyword_id |
+---------+------------+----------+------------+
| az | 2020-05-08 | 1 | 3360 |
| bags | 2020-05-08 | 39 | 3314 |
| bags | 2020-04-27 | 100 | 3314 |
| bags | 2020-04-09 | 100 | 3314 |
| bags | 2020-04-08 | 100 | 3314 |
| battery | 2020-05-08 | 14 | 3337 |
| battery | 2020-04-27 | 100 | 3337 |
position 值是根据最新的created_at 显示的主要字段。请帮我解决这个问题。
【问题讨论】:
-
我不明白。你到底在期待什么?所以你想让最终输出按照created_at的降序排序,还是name升序再created_at降序排序?
-
应该是 created_at 的顺序。即使名称顺序不存在,也无法根据要求进行排序。
-
也输出应该像第二个(没有时间)
-
实际输出中,有
bags的记录有4条。在您的预期输出中,只有 3 个。这是为什么呢? -
对不起!已更新。