mysql / php выбирает первую и последнюю запись для каждого года, в котором есть записи в определенном столбце в базе данных - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть таблица записей наблюдений за дикой природой для разных животных.Каждая строка в таблице представляет собой карточку записи, содержащую столбцы для различных животных, которые можно увидеть, а также столбец идентификатора и столбец DateSeen.

Я хотел бы отображать первую и последнюю записи для каждого годаиз таблицы ниже, где был замечен 1 или более конкретного животного.Мне нужно отображать первую и последнюю даты для каждого года, включая будущие, по мере добавления новых данных.Первая и последняя показанные даты должны основываться на параметре URL, который выбирает, какой столбец (животное) запрашивать.

Как это делается с использованием запроса выбора MySQL и PHP?

TABLE

ID    DateSeen       Lion             Tiger
01    2018-01-01     1                4
02    2018-08-15     2                0
03    2018-09-04     0                2
04    2017-02-02     1                3
05    2017-06-19     2                0 
06    2017-07-24     1                1
07    2017-07-26     0                4
08    2016-01-06     1                1
09    2016-09-17     1                0 
10    2016-09-19     0                4
11    2015-06-11     0                1
12    2015-10-09     1                0
13    2015-10-12     1                0

Если параметр URL = Tiger, результаты должны возвращать

ID    DateSeen (DD-MM-YYYY)       Tiger
01    01-01-2018                  4        = first sighting of Tiger in 2018
03    04-09-2018                  2        = last sighting of Tiger in 2018
04    02-02-2017                  3        = first sighting of Tiger in 2017
06    24-07-2017                  1        = last sighting of Tiger in 2017
08    06-01-2016                  1        = first sighting of Tiger in 2016
10    19-09-2016                  4        = last sighting of Tiger in 2016
11    11-06-2015                  1        = first sighting of Tiger in 2015
11    11-06-2015                  1        = last sighting of Tiger in 2015

Если параметр URL = Lion, результаты должны возвращаться

ID    DateSeen (DD-MM-YYYY)      Lion
01    01-01-2018                 1        = first sighting of Lion in 2018
02    15-08-2018                 2        = last sighting of Lion in 2018
04    02-02-2017                 1        = first sighting of Lion in 2017
06    24-07-2017                 1        = last sighting of Lion in 2017
08    06-01-2016                 1        = first sighting of Lion in 2016
09    17-09-2016                 1        = last sighting of Lion in 2016
12    09-10-2015                 1        = first sighting of Lion in 2015
13    12-10-2015                 1        = last sighting of Lion in 2015

Неважно, совпадают ли даты первого и последнего наблюдения конкретного животного (т. Е. Тигра видели только один раз в 2015 году, так как мне нужно показать, что это наблюдение является первым иПоследнее наблюдение в результатах.

Формат даты в базе данных: ГГГГ-ММ-ДД, и мне нужно отобразить результаты с форматом года в формате ДД-ММ-ГГГГ.

Огромное спасибозаранее всем, кто может помочь. Ох, и я использую PHP (pdo), MySql и PhpMyAdmin. У меня более 30 тысяч записей и 40 животных! Стив

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

ваша схема базы данных очень плохая, должна быть такая

id, datetime, animal

1, 2018-01-01 15:21:32, Lion (type = enum (Lion,Тигр и т.д ..))

А вот твой вопрос

SELECT id,Tiger,date_format(DateSeen, '%d-%m-%Y') as dateAlias from your_table where date_format(DateSeen, '%Y-01-01') = DateSeen OR date_format(DateSeen, '%Y-12-31') = DateSeen AND Tiger > 0
0 голосов
/ 22 февраля 2019

Вы должны изменить структуру таблицы, это плохо.После того, как вы создадите хорошую структуру, вы можете использовать запрос следующим образом:

SELECT min(DateSeen) as first, max(DateSeen) as last, animal FROM animals
GROUP BY year(DateSeen)
0 голосов
/ 22 февраля 2019

Все ваши тестовые данные относятся к 2018 году, и при условии, что вам нужны записи из столбца таблицы, значение животного больше нуля

SELECT * 
FROM   (SELECT id, 
               dateseen, 
               lion, 
               year1 
        FROM   table5 t1 
               INNER JOIN (SELECT Substr(dateseen, 1, 4) year1, 
                                  Min(dateseen)          min_dateseen 
                           FROM   table5 
                           WHERE  lion <> 0 
                           GROUP  BY Substr(dateseen, 1, 4)) t2 
                       -- get first and last dateseen for each year  
                       ON t1.dateseen = t2.min_dateseen 
        UNION 
        SELECT id, 
               dateseen, 
               lion, 
               year1 
        FROM   table5 t2 
               INNER JOIN (SELECT Substr(dateseen, 1, 4) year1, 
                                  Max(dateseen)          AS max_dateseen 
                           FROM   table5 
                           WHERE  lion <> 0 
                           GROUP  BY Substr(dateseen, 1, 4)) t3 
                       ON t2.dateseen = t3.max_dateseen) t4 
ORDER  BY year1 DESC, 
          Date_format(dateseen, '%Y-%m-%d') ASC; 

см. Dbfiddle - DBFiddleDemo для завершениярешение

Если ваша версия 8.0, вы можете использовать CTE, что уменьшит количество необходимых запросов.

Надеюсь, это поможет

...