gpt4 book ai didi

mysql - 在 Doctrine 2 中按组内排序

转载 作者:可可西里 更新时间:2023-11-01 06:44:14 26 4
gpt4 key购买 nike

我将 Symfony 2 PR12 与 Doctrine 2 和 MySQL 一起使用。我有一个数据库存储文章和这些文章的 View :

// ...
class Article {

/**
* @orm:Column(type="bigint")
* @orm:Id
* @orm:GeneratedValue
* @var int
*/
protected $id;

/**
* @orm:OneToMany(targetEntity="ArticleView",mappedBy="article")
* @var ArrayCollection
*/
protected $views;

// ...
}

// ...
class ArticleView {

/**
* @orm:Column(type="bigint")
* @orm:Id
* @orm:GeneratedValue
* @var int
*/
protected $id;

/**
* @orm:Column(type="bigint",name="DateRead",nullable=true)
* @var int
*/
protected $viewDate;

/**
* @orm:ManyToOne(targetEntity="Article",inversedBy="views")
* @var Article
*/
protected $article;

// ...
}

例如,我想获取最近查看的 20 篇文章。我的第一个想法是:

$qb = <instance of Doctrine\ORM\QueryBuilder>;
$qb->select('a')
->from('Article', 'a')
->join('a.views', 'v')
->orderBy('v.viewDate', 'DESC')
->groupBy('a.id')
->setMaxResults(20)
;

但是,当有多个 View 与一篇文章关联时,排序依据/分组依据组合会产生不可预测的排序结果。

这是 MySQL 的预期行为,因为分组是在排序之前处理的,并且在 http://www.artfulsoftware.com/infotree/mysqlquerytree.php 上有针对此问题的有效原始查询解决方案。 (聚合 -> 组内聚合)。但我不知道如何将这些解决方案中的任何一个转换为 DQL,因为据我所知,没有办法从子查询中进行选择或执行 self 排除连接。

关于如何以合理的性能解决问题有什么想法吗?

最佳答案

我最终用相关子查询解决了它:

$qb
->select('a')
->from('Article', 'a')
->join('a.views', 'v')
->orderBy('v.viewDate', 'DESC')
->setMaxResults(20)

// Only select the most recent article view for each individual article
->where('v.viewDate = (SELECT MAX(v2.viewDate) FROM ArticleView v2 WHERE v2.article = a)')

这样排序会忽略任何给定文章的最新文章以外的 ArticleView。虽然我的猜测是,相对于其他原始 SQL 解决方案,它的性能相当差 - 任何具有更好性能的答案仍然会非常感激 :)。

关于mysql - 在 Doctrine 2 中按组内排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5766924/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com