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

Я новичок в переполнении стека и хотел спросить, не могли бы вы, возможно, просмотреть мой код и дать мне несколько советов по его улучшению и получить нужный результат.

Я начал с такой таблицы:

Table `time`:

|id|datetime           |type|
|97|2019-01-16 17:22:41|7   |
|96|2019-01-16 16:25:36|5   |
|94|2019-01-16 08:35:01|2   |
|93|2019-01-16 07:45:28|1   |

.. есть другие дни, с такой же схемой, но разных типов.

Чтобы получить только уникальные даты, я использую этот запрос:

"SELECT DISTINCT date(date_format(datetime, '%Y-%m-%d')) as uniquedates, active FROM time WHERE active = 1"

После этого я использую полученные дни / даты, чтобы получить самые низкие / самые высокие данные, например:

if($count != 0)
{
    while($row = $statement->fetch()) 
    {
        $dates[] = $row['uniquedates'];
    }
}

foreach($dates as $date)
{
    $statement = $pdo->prepare("SELECT MIN(type) AS lowest, MAX(type) AS highest FROM time WHERE datetime LIKE '%$date%'");
    $result = $statement->execute();
    //error handling
    while($row = $statement->fetch()) 
    {
        echo $date ." -> ". $row['lowest'] ." +> ". $row['highest'] ."<br>";
    }
}

Итак, я получаю результат как:

2018-12-03 -> 1 +> 7
...
2018-12-13 -> 1 +> 7
2018-12-14 -> 5 +> 6
2018-12-17 -> 1 +> 7
...
2018-12-20 -> 1 +> 7
2018-12-24 -> 10 +> 11
2018-12-21 -> 8 +> 9
2019-01-07 -> 1 +> 7
2019-01-08 -> 1 +> 7
2019-01-11 -> 1 +> 7
2018-12-27 -> 10 +> 11
2018-12-28 -> 10 +> 11
2019-01-14 -> 1 +> 7
2019-01-15 -> 1 +> 7
2019-01-16 -> 1 +> 7
...

Показывает дату и связанные низкие / высокие значения.

К сожалению, я не могу получить значение datetime оттуда, поэтому я застрял здесь.

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

Итак, из моего примера таблицы, строки 93 и 97.

|id|datetime           |type|
|97|2019-01-16 17:22:41|7   |
|93|2019-01-16 07:45:28|1   |

Я совершенно уверен, что это можно сделать гораздо проще, чем моя попытка. :)

Спасибо, что нашли время, чтобы прочитать мой первый пост. Любой совет / помощь / пример высоко ценится!

С уважением Alex

1 Ответ

0 голосов
/ 17 января 2019

Если вы выполняете SQL-запросы в цикле, вы обычно делаете что-то, что должно быть частью SQL.

Попробуйте следующее:

SELECT date_format(datetime, '%Y-%m-%d') as d,
  MIN(type) AS lowest,
  MAX(type) AS highest
FROM time
WHERE active = 1
GROUP BY d
...