原则 ORDER BY 列但 DISTINCT 在另一列

Posted

技术标签:

【中文标题】原则 ORDER BY 列但 DISTINCT 在另一列【英文标题】:Doctrine ORDER BY column but DISTINCT on another column 【发布时间】:2020-01-26 00:05:59 【问题描述】:

我似乎无法理解我正在尝试为我正在开发的监控系统执行的 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();

但是,虽然这会为该站点返回一组磁盘,但它们是最旧的,而不是最新的记录。

任何和所有的帮助表示赞赏! :)

M

【问题讨论】:

查询很简单。不过有几件事,使用双引号而不是单引号。当您需要在查询中使用字符串时,它只允许对字符串值进行单引号。除此之外,我会尝试在select() 之后移动distinct()。如果它没有改变任何东西,也许日期格式是问题? 谢谢@Preciel,但这对查询的返回没有影响。我已更新问题以显示查询修改。 第一!你需要在选择中指定值,而且我认为你需要使用左连接,我不确定 100% 我认为你不能同时使用 distinct 和 groupby,需要使用计数。看这个例子:***.com/a/41492633/12232340 和这里github.com/AliHichem/AliDatatableBundle/issues/22 【参考方案1】:

我认为这应该可以解决您的问题。distinc() 不是必需的,并且会失败,因为每个条目的某些字段不同。

我指定要选择的数据只有具有相同值的字段。 要知道最近的,我用MAX() 选择了dProfilgroupBy() 将使您获得唯一/不同的结果。 然后返回一个标量结果(数组而不是对象)。

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();

【讨论】:

以上是关于原则 ORDER BY 列但 DISTINCT 在另一列的主要内容,如果未能解决你的问题,请参考以下文章

如何应用:大查询中的count(distinct ...)超过(partition by ... order by)?

mysql ORDER BY,GROUP BY 和DISTINCT原理

解决distinct与order by 的冲突

如何同时使用 DISTINCT 和 ORDER BY RANDOM 进行 SELECT?

如何在同一个 SELECT 语句中使用 DISTINCT 和 ORDER BY?

MySQL 查询优化 - distinct、order by 和 limit