【问题标题】:generate index columns for "ORDER BY x, y"为“ORDER BY x, y”生成索引列
【发布时间】:2014-06-22 22:12:52
【问题描述】:

我使用这个查询来汇总表export_blocks的内容,按用户和日期聚合,并保存为新表:

CREATE TABLE export_days
SELECT user_id DATE(submitted) AS date_str,
FROM export_blocks
GROUP BY user_id, DATE(submitted)
ORDER BY user_id, submitted

如何为每个user_id 获取该用户的记录日期的增量索引?每个用户的索引应从 1 开始,遵循 ORDER BY。 IE。我想使用 SQL 生成下面输出的date_index

user_id date_str   date_index
brian   2014-06-10 1
brian   2014-06-12 2
brian   2014-06-15 3
louis   2014-06-08 1
louis   2014-06-16 2
lucy    2013-11-15 1
(etc...)

我一直在尝试https://stackoverflow.com/a/5493480/1297830,但我无法让它工作。它过早停止计数器,给id_nodate_no 提供的数字太低。

【问题讨论】:

  • 您的问题不清楚。你到底想达到什么目的?
  • 显示您的实际查询,包括group by
  • 我已经更新了问题。我希望现在更清楚了。

标签: mysql sql sql-order-by


【解决方案1】:

基于您的示例查询,您可以执行简单(依赖)子查询来获取结果;

SELECT id, date_str, 
  (SELECT COUNT(DISTINCT id)+1 FROM mytable WHERE id < a.id) id_no,
  (SELECT COUNT(id)+1 FROM mytable WHERE id = a.id AND date_str < a.date_str) date_no
FROM mytable a
ORDER BY id;

...或者你可以做几个自我连接;

SELECT a.id, a.date_str, 
  COUNT(DISTINCT b.id)+1 id_no,
  COUNT(DISTINCT c.date_str)+1 date_no
FROM mytable a
LEFT JOIN mytable b ON a.id > b.id
LEFT JOIN mytable c ON a.id = c.id AND a.date_str > c.date_str
GROUP BY a.id, a.date_str
ORDER BY a.id, a.date_str;

An SQLfiddle showing both in action.

遗憾的是,两者都不是一个非常高效的解决方案,但由于 MySQL 缺乏分析(即排名)功能,因此选择有限。使用用户变量进行排名也是一种选择,但是众所周知,它们使用起来很棘手并且不可移植,所以我只会在性能需要时才去那里。

【讨论】:

  • 谢谢你,约阿希姆。这绝对看起来像要走的路。性能不是问题,我只需要这样做一次。我不太了解FROM mytable a 语法。 a 是对子查询外“外部命名空间”中mytable 的当前行的引用吗?
  • @Jonas 在子查询版本中,a 只是外部查询中mytable 的别名。这允许内部查询引用a.id,以便它知道它当前应该使用哪一行。如果我们不给它起别名并在内部查询中使用mytable.id,它将被内部查询自己的mytable隐藏。
【解决方案2】:

根据 Joachim 的出色回答,我制定了解决方案。当每个用户每天有多行时,它也可以工作。

CREATE TABLE export_days
SELECT 
    user_id, DATE(submitted) AS date_str,
    (SELECT COUNT(DISTINCT DATE(submitted))+1 FROM export_blocks WHERE user_id = a.user_id AND submitted < a.submitted) date_no
FROM export_blocks a
GROUP BY user_id, DATE(submitted)
ORDER BY user_id, submitted

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 2013-09-20
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多