【问题标题】:How to get the first result of a left join with Doctrine and postgreSQL如何使用 Doctrine 和 postgreSQL 获得左连接的第一个结果
【发布时间】:2016-05-06 02:51:59
【问题描述】:

在使用 Doctrine 2 和 postgreSQL 数据库的项目中,我在实体 Gynecologist 与其电子邮件和电话号码之间建立了简单的一对多关系。我想查询数据库以获取每个人第一个插入的电子邮件和号码的一行。 我希望得到如下结果:

-------------------
SURNAME  | NAME  | EMAIL           | TEL. NR.|
Surname1 | Name1 | email1@gmail.it | number1 |
-------------------

我试过了:

$columns = array('g.id', 'g.companyName', 'g.surname', 'g.name', 'e.email', 't.number');

$queryBuilder = $this->getDoctrine()
    ->getRepository('AppBundle:Gynecologist')
    ->createQueryBuilder('g')
    ->select($columns)
    ->join('g.emails', 'e')
    ->join('g.telephoneNumbers', 't')
    ->orderBy('g.surname', 'ASC')
    ->addOrderBy('g.name', 'ASC')
    ->groupBy('g.id')
    ->addGroupBy('g.companyName')
    ->addGroupBy('g.surname')
    ->addGroupBy('g.name')
    ->addGroupBy('e.email')
    ->addGroupBy('t.number');

这是生成的查询:

SELECT g0_.id AS id_0, g0_.company_name AS company_name_1, g0_.surname AS surname_2, g0_.name AS name_3, g1_.email AS email_4, g2_.number AS number_5 
FROM gynecologists 
g0_ INNER JOIN gynecologists_emails g1_ ON g0_.id = g1_.gynecologist_id 
INNER JOIN gynecologists_telephone_numbers g2_ ON g0_.id = g2_.gynecologist_id
GROUP BY g0_.id, g0_.company_name, g0_.surname, g0_.name, g1_.email, g2_.number 
ORDER BY g0_.surname ASC, g0_.name ASC 
LIMIT 500 OFFSET 0

根据 StackOverflow 用户收到的建议,我也尝试了:

$columns = array('DISTINCT g.id', 'g.companyName', 'g.surname', 'g.name', 'e.email', 't.number');

$queryBuilder = $this->getDoctrine()
    ->getRepository('AppBundle:Gynecologist')
    ->createQueryBuilder('g')
    ->select($columns)
    ->join('g.emails', 'e')
    ->join('g.telephoneNumbers', 't')
    ->orderBy('g.surname', 'ASC')
    ->addOrderBy('g.name', 'ASC');

SELECT DISTINCT g0_.id AS id_0, g0_.company_name AS company_name_1, g0_.surname AS surname_2, g0_.name AS name_3, g1_.email AS email_4, g2_.number AS number_5 
FROM gynecologists g0_ 
INNER JOIN gynecologists_emails g1_ ON g0_.id = g1_.gynecologist_id 
INNER JOIN gynecologists_telephone_numbers g2_ ON g0_.id = g2_.gynecologist_id
ORDER BY g0_.surname ASC, g0_.name ASC 
LIMIT 500 OFFSET 0

但结果总是:

-------------------
SURNAME  | NAME  | EMAIL           | TEL. NR.|
Surname1 | Name1 | email1@gmail.it | number1 |
Surname1 | Name1 | email1@gmail.it | number2 |
Surname1 | Name1 | email2@gmail.it | number1 |
Surname1 | Name1 | emai21@gmail.it | number2 |
-------------------

谢谢。

【问题讨论】:

  • 当使用 group by 时,所有选择的列必须要么在 group by 列中,要么与聚合函数一起使用,如 max()、avg()...
  • 好的。但是如何修复查询以每人只返回一行?按所选列分组,我得到的每人行数与保存的电子邮件或电话号码的数量一样多......
  • 可以添加生成的查询吗?
  • 完成,我编辑了帖子。
  • 如何确定第一个插入的电子邮件和号码?有什么规定吗?

标签: php postgresql doctrine-orm


【解决方案1】:

我认为它应该适合你:

$columns = array('DISTINCT g.id', 'g.companyName', 'g.surname', 'g.name', 'e.email', 't.number');

$queryBuilder = $this->getDoctrine()
    ->getRepository('AppBundle:Gynecologist')
    ->createQueryBuilder('g')
    ->select($columns)
    ->join('g.emails', 'e')
    ->join('g.telephoneNumbers', 't')
    ->orderBy('g.surname', 'ASC')
    ->addOrderBy('g.name', 'ASC');

【讨论】:

  • 它不起作用。我根据您的建议编辑了我的消息。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 2023-02-11
  • 2012-09-14
  • 2017-12-28
  • 2023-03-30
  • 2014-05-25
相关资源
最近更新 更多