Показывать строки друг над другом, если и только если они размещены в один день - PullRequest
1 голос
/ 10 июня 2019

У меня есть таблица, как

+---------------------+-------+
| date_in             | title |
+---------------------+-------+
| 2018-01-01 00:00:00 | foo2  |
| 2018-01-02 00:00:00 | bar   |
| 2018-01-03 00:00:00 | man   |
| 2018-01-04 01:00:00 | foo2  |
| 2018-01-04 02:00:00 | foo   |
| 2018-01-04 03:00:00 | foo1  |
| 2018-01-04 04:00:00 | foo2  |
| 2018-01-05 00:00:00 | test  |
+---------------------+-------+

Мой желаемый результат -

+---------------------+-------+
| date_in             | title |
+---------------------+-------+
| 2018-01-05 00:00:00 | test  |
| 2018-01-04 04:00:00 | foo2  | -- see this
| 2018-01-04 01:00:00 | foo2  | -- see this
| 2018-01-04 03:00:00 | foo1  |
| 2018-01-04 02:00:00 | foo   |
| 2018-01-03 00:00:00 | man   |
| 2018-01-02 00:00:00 | bar   |
| 2018-01-01 00:00:00 | foo2  |
+---------------------+-------+

Я пробовал приведенный ниже запрос и другие несколько запросов, но он не работает

SELECT
    detail.* 
FROM
    test detail
    JOIN ( SELECT min( date_in ) firstdate, title FROM test GROUP BY title ) firstdate ON detail.title = firstdate.title 
ORDER BY
    firstdate.firstdate,
    detail.title,
    detail.date_in 

но этот запрос показывает строки с одинаковыми заголовками друг над другом независимо от даты

Я хочу, чтобы строки отображались друг над другом, только если они находятся в один и тот же день

Здесь http://sqlfiddle.com/#!9/039aa/6 SQLFiddle со схемой.

Ответы [ 3 ]

3 голосов
/ 10 июня 2019

кажется, вам нужен порядок по дате (date_in) и названию desc

 SELECT
    detail.* 
 FROM test detail
 ORDER BY
    date(detail.date_in),
    detail.title desc,
    detail.date_in 
1 голос
/ 10 июня 2019

Я думаю, что вы действительно хотите упорядочить заголовки не позднее каждого дня. В MySQL 8+ вы можете сделать:

 SELECT d.* 
 FROM test d
 ORDER BY date(d.date_in),
          MAX(d.date_in) OVER (PARTITION BY date(d.date_in), d.title),
          d.title desc,
          d.date_in ;

В более ранних версиях вы можете использовать подзапрос. Вот один из методов:

 SELECT d.* 
 FROM test d
 ORDER BY date(d.date_in),
          (SELECT MAX(d2.date_in) FROM test d2 WHERE d2.title = d.title AND DATE(d2.date_in) = DATE(d.date_in)),
          d.title desc,
          d.date_in;

Или вы можете использовать явное JOIN:

SELECT d.* 
FROM test d JOIN
     (SELECT d2.title, DATE(d2.date_in) as date, MAX(d2.date_in) as max_date_in
      FROM test d2
      GROUP BY d2.title, DATE(d2.date_in) 
     ) d2
     ON d2.title = d.title AND d2.date = DATE(d.date_in)
ORDER BY date(d.date_in),
         d2.max_date_in,
         d.title desc,
         d.date_in  
0 голосов
/ 10 июня 2019

Попробуйте:

SELECT
    detail.* 
FROM
    test detail
    JOIN ( SELECT min( date_in ) firstdate, title FROM test GROUP BY title ) firstdate ON detail.title = firstdate.title 
ORDER BY
    DATE(detail.date_in),
    detail.title;

Удалено firstdate.firstdate и редактируйте DATE(detail.date_in) из ORDER BY.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...