Mysql 将具有内部联接的SQL查询转换为条令查询生成器

Mysql 将具有内部联接的SQL查询转换为条令查询生成器,mysql,sql,symfony,doctrine-orm,Mysql,Sql,Symfony,Doctrine Orm,我在将以下SQL查询转换为doctrine queryBuilder语法时遇到问题。我选择了查询生成器,因为我读到内部连接不可能与DQL(我可以与DQL兼容)。在经过大量搜索之后,我真的感到头痛的时候,非常感谢您通常的帮助: SELECT m.* FROM `message` AS m INNER JOIN (SELECT sender_id, MAX(message_date) as md FROM message WHERE `receiver_id`

我在将以下SQL查询转换为doctrine queryBuilder语法时遇到问题。我选择了查询生成器,因为我读到内部连接不可能与DQL(我可以与DQL兼容)。在经过大量搜索之后,我真的感到头痛的时候,非常感谢您通常的帮助:

SELECT m.* 
FROM  `message` AS m
INNER JOIN (SELECT sender_id, MAX(message_date) as md
                FROM message WHERE  `receiver_id` =1 GROUP BY sender_id) AS t
ON m.id=t.md and m.sender_id=t.sender_id
WHERE  `receiver_id` =1
换句话说,我的最终目标是从如下表中选择一个
receiver\u id
接收到的所有最新消息:

消息(id、发送者id、接收者id、消息日期)


我认为您应该能够管理文档
但我要告诉你的是:

在您的
消息
存储库中:

$queryBuilder = $this->createQueryBuilder('m');
$queryBuilder->addSelect('s')
    ->innerJoin('m.sender', 's')
    ->where('m.receiver = :receiver_id')
    ->andWhere($queryBuilder->expr()->max('m.date'))
    ->setParameters(
        array(
            'receiver_id' => $receiver_id,
        )
    );

$query = $queryBuilder->getQuery();
return $query->getSingleResult();
$qb  = $this->_em->createQueryBuilder();
$sub = $qb;

$sub->select('t')
    ->where('m.id = t.id')
    ->andWhere($qb->expr()->max('t.date'))
    ->getQuery();

$qb = $qb->select('m')
         ->where($qb->expr()->in('m', $sub->getDQL()))
         ->andWhere('m.receiver = :receiver_id');

$query = $qb->getQuery();
return $query->getResult();
我希望我正确理解了您的SQL。 没有实体定义,这就是我所能说的。否则你应该把它们添加到你的问题中

更新 查看最终查询后的最后一次更新。您可以使用子查询生成器在中执行

在您的
MembersManagementBundle:Message
存储库中:

$queryBuilder = $this->createQueryBuilder('m');
$queryBuilder->addSelect('s')
    ->innerJoin('m.sender', 's')
    ->where('m.receiver = :receiver_id')
    ->andWhere($queryBuilder->expr()->max('m.date'))
    ->setParameters(
        array(
            'receiver_id' => $receiver_id,
        )
    );

$query = $queryBuilder->getQuery();
return $query->getSingleResult();
$qb  = $this->_em->createQueryBuilder();
$sub = $qb;

$sub->select('t')
    ->where('m.id = t.id')
    ->andWhere($qb->expr()->max('t.date'))
    ->getQuery();

$qb = $qb->select('m')
         ->where($qb->expr()->in('m', $sub->getDQL()))
         ->andWhere('m.receiver = :receiver_id');

$query = $qb->getQuery();
return $query->getResult();

不确定您在这里做什么
m.id=t.md
。这是否真的意味着
message\u id
等于
message\u date
?哦,感谢您尽全力理解我的SQL查询,即使它包含您在评论中提到的输入错误。非常感谢你抽出时间。我会回来仔细阅读这篇文章(因为我刚刚醒来),并将其与文章结合起来,因为这也是我昨晚睡觉前发现的一个绝妙的想法。很好的氛围。嗨,先生,最后,我创建了一个结构更简单的新查询:
SELECT a.*从a.sender\u id=b.sender\u id和a.message\u date上的message a左外连接message b中选择a.
,现在我将尝试实现您的函数,并结合文档来找出查询生成器的方法这里是我将要使用的更简单且有效的最终代码:
$query=$this->repository->createQueryBuilder('m')->leftJoin('MembersManagementBundle:Message','t','WITH','m.messageDate其中('m.receiver=:ver\u id And t.id为null')->setParameter('ver_id',$receiver_id)->getQuery();
。如果您喜欢在原始SQL中去掉聚合函数,而是使用外部左连接(这会缩短SQL),您可以使用新代码自由编辑答案thanks@whitelettersinblankpapers为什么您需要在
消息
leftJoin
?我认为您不需要这样做,因为
messageDate
sender
字段也是
m
的属性,或者
m
不是
成员管理BUndle:Message
实体?你知道我为什么迟了回答你,因为我不能让它工作,这是因为我对这类东西的经验有限。目前它给了我
[语法错误]第0行,列-1:错误:预期=,=,!=,得到字符串结尾。
。我会回来的,先生,当我能够继续这方面的工作时。