Doctrine ORDER BY 列但在另一列上是 DISTINCT
Doctrine ORDER BY column but DISTINCT on another column
我似乎无法理解我正在尝试为我正在处理的监控系统执行的 Doctrine 查询。我的底层数据库是 SQLite。
我的table相当简单:
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" 并且此导入已连续 运行ning 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();
但是,虽然这 returns 是该站点的一组磁盘,但它们是最旧的,而不是最新的记录。
感谢所有帮助! :)
男
我认为这应该可以解决您的问题。
distinc()
不是必需的并且会失败,因为每个条目的某些字段不同。
我指定要selected 的数据只有具有相同值的字段。
要知道最近的,我用了MAX()
到selectdProfil
.
groupBy()
会成功,所以你只会得到 unique/distinct 结果。
然后返回一个标量结果(数组而不是对象)。
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();
我似乎无法理解我正在尝试为我正在处理的监控系统执行的 Doctrine 查询。我的底层数据库是 SQLite。
我的table相当简单:
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" 并且此导入已连续 运行ning 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();
但是,虽然这 returns 是该站点的一组磁盘,但它们是最旧的,而不是最新的记录。
感谢所有帮助! :)
男
我认为这应该可以解决您的问题。
distinc()
不是必需的并且会失败,因为每个条目的某些字段不同。
我指定要selected 的数据只有具有相同值的字段。
要知道最近的,我用了MAX()
到selectdProfil
.
groupBy()
会成功,所以你只会得到 unique/distinct 结果。
然后返回一个标量结果(数组而不是对象)。
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();