Doctrine ORDER BY столбец, но DISTINCT для другого столбца - PullRequest
0 голосов
/ 26 января 2020

Не могу обернуть голову вокруг Doctrine запроса, который я пытаюсь выполнить для системы мониторинга, над которой я работаю. Моя базовая база данных - SQLite.

Моя таблица довольно проста:

CREATE TABLE disk_space_usage (
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    disk_name VARCHAR(255) NOT NULL,
    size INTEGER NOT NULL,
    free INTEGER NOT NULL,
    d_profile DATETIME NOT NULL --(DC2Type:datetime_immutable),
    site_id INTEGER NOT NULL
)

Каждый раз, когда выполняется импорт из системы сбора данных, у нас будет несколько новых записей, созданных для каждого "site_id". Каждая группа записей для «site_id» будет иметь одно и то же значение «d_profile».

Я хочу запросить Doctrine, чтобы получить последний набор записей, доступных для данного «site_id».

Например, скажем, «site_id» 12345 имеет 5 дисков: «d1», «d2», «d3», «d4» и «d5», и что этот импорт выполнялся в течение 100 дней подряд. Там будет 500 записей, связанных с "site_id" 12345. Я хотел бы получить последние 5.

Однако количество дисков будет варьироваться от сайта к сайту и может отличаться для любого данного сайта, так как диски введен в эксплуатацию и выведен из эксплуатации. Кроме того, нет гарантии, что импорт будет выполняться каждый день, поэтому мне нужно получить самый последний набор записей для этого сайта, независимо от даты и независимо от количества дисков.

Мой запрос в настоящее время выглядит как это:

return $this->createQueryBuilder('dsu')
    ->select()
    ->distinct()
    ->where('dsu.site = :customer')
    ->groupBy('dsu.diskName')
    ->orderBy('dsu.dProfile', 'DESC')
    ->setParameter('customer', $customerSite)
    ->getQuery()
    ->getResult();

Однако, хотя это возвращает один набор дисков для этого сайта, они являются самыми старыми, а не самыми последними записями.

Любая и вся помощь приветствуется! :)

М

1 Ответ

1 голос
/ 26 января 2020

Я думаю, что это должно решить вашу проблему.
distinc() не требуется и завершится ошибкой, потому что некоторые поля различны для каждой записи.

Я указал данные, которые должны быть выбраны, чтобы иметь только поля с тем же значением.
Чтобы узнать самое последнее, я использовал MAX(), чтобы выбрать dProfil.
. groupBy() сделает это так, что вы получите только уникальный / отличный результат.
Затем вернул скаляр результат (массив вместо объекта).

return $this->createQueryBuilder("disque")
            ->select("disque.id, disque.diskName, disque.size, disque.free, MAX(disque.dProfile) AS dProfile")
            ->andWhere("disque.site = :customer")
            ->groupBy("disque.diskName")
            ->orderBy("disque.dProfile", "DESC")
            ->setParameter('customer', $customerSite)
            ->getQuery()
            ->getScalarResult();
...