如何按时间戳排序SQL排序

问题描述 投票:-1回答:1

假设我有以下表格(我正在使用的简化版本):

CREATE TABLE posts (
  id INTEGER,
  title VARCHAR(255),
  text TEXT,
  author_id INTEGER,
  created_at TIMESTAMP
);

CREATE TABLE authors (
  id INTEGER,
  name VARCHAR(255),
  email VARCHAR(255)
);

我想要做的只是检索作者,但按一周的条纹数量排序。也就是说,作者发表帖子的连续周数。发布帖子的时间存储在posts_at列中

我最困难的是理解如何计算跨行的帖子之间的时间差。我正在使用MySQL

mysql sql-order-by datediff
1个回答
0
投票

没有窗口函数,在MySql 5.7中做起来有点困难

但这是一个使用变量的实验测试片段:

样本数据:

DROP TABLE IF EXISTS `posts`;
DROP TABLE IF EXISTS `authors`;

CREATE TABLE `authors` (
  id INTEGER PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(255),
  email VARCHAR(255)
);

CREATE TABLE `posts` (
  id INTEGER PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(255),
  `text` TEXT,
  author_id INTEGER,
  created_at TIMESTAMP,
  CONSTRAINT fk_posts_author_id FOREIGN KEY (author_id) REFERENCES `authors`(id)
);

insert into `authors` (name, email) values
('john doe', '[email protected]'),
('jane sheppard', '[email protected]');

insert into `posts` (author_id, created_at, title, `text`) values
(1, '2019-02-07', 'When', 'bla'),
(1, '2019-02-09', 'I', 'bla2'),
(1, '2019-02-14', 'Start', 'bla3'),
(1, '2019-02-19', 'looking', 'bla4'),
(1, '2019-03-10', '...', 'bla5'),
(2, '2019-02-01', 'I', 'blah1'),
(2, '2019-02-05', 'frighten', 'blah2'),
(2, '2019-02-19', 'even', 'blah3'),
(2, '2019-03-20', 'myself', 'blah4');

查询:

SELECT q3.ConcurrentWeeks, q3.StartWeekDate, a.*
FROM
(
    SELECT COUNT(*) as ConcurrentWeeks, MIN(WkDt) as StartWeekDate, author_id
    FROM 
    (
        SELECT q1.WkDt, q1.Total
        , case 
          when @author = author_id and @yr = yr and @wk = wk-1 then @rnk
          else @rnk := @rnk + 1
          end as rnk
        , @author := author_id as author_id
        , @yr := yr as yr
        , @wk := wk as wk
        FROM
        (
            SELECT 
             author_id, YEAR(created_at) as yr, WEEK(created_at) as wk
             , COUNT(*) AS Total
             , COALESCE(MIN(STR_TO_DATE(concat(YEAR(created_at),' monday ',WEEK(created_at)),'%X %W %V')), MIN(CAST(created_at AS DATE))) AS WkDt
            FROM `posts` p
            GROUP BY author_id, YEAR(created_at), WEEK(created_at)
            ORDER BY author_id, yr, wk
        ) q1
        CROSS JOIN (select @author := null, @yr := null, @wk := null, @rnk := 0) init
    ) q2
    GROUP BY author_id, rnk
    HAVING ConcurrentWeeks > 1
) q3
LEFT JOIN `authors` a ON a.id = q3.author_id
ORDER BY ConcurrentWeeks DESC, StartWeekDate ASC

结果:

ConcurrentWeeks StartWeekDate   id  name            email
--------------- -------------   --  -------------   ----------------------
3               2019-02-04      1   john doe        [email protected]
2               2019-01-28      2   jane sheppard   [email protected]
© www.soinside.com 2019 - 2024. All rights reserved.