将SQL查询的循环合并为一个SQL查询

4

我在PHP中建立了一个循环,执行了500个SQL查询,但我想把这500个SQL查询合并成一个,并获得相同的返回结果(每个公司的用户数和公司名称)。

PHP代码示例:

$companies =  array();
foreach ($fortune500Service->listAll() as $c ){
  $count = $entityManager
  ->createQueryBuilder()
  ->select("count(u)")
  ->from("AppBundle\Entity\User","u")
  ->where("u.email LIKE :d")
  ->setParameter("d", "%@" . $c["Domain"])
  ->getQuery()->getSingleScalarResult();

  if ($count == 0) {
    continue;
  }

  $companies[] = array(
      "Domain" => $c["Domain"],
      "Company" => "{$c["Company"]} ({$count})",
  );
}
return $companies;

我将为您翻译两个需要合并的SQL查询示例

查询1:

SELECT 
  count(u0_.id) 
FROM 
  user u0_ 
WHERE 
  u0_.email LIKE '%@company1.com' 

查询2

SELECT 
  count(u0_.id)
FROM 
  user u0_ 
WHERE 
  u0_.email LIKE '%@company2.com' 

我更倾向于使用 createQueryBuilder 的解决方案,http://symfony.com/doc/current/book/doctrine.html#querying-for-objects-using-doctrine-s-query-builder 但如果使用本地 SQL 查询也可以。


将所有 u0_.email LIKE '%@somecompany.com' 条件放入一个数组中,并使用 OR 连接它们。 - syck
我不确定,但如果我将所有的 u0_.email LIKE '%@somecompany.com' 条件放入一个数组中,并用 OR 连接它们。那么我得到的结果是任何公司的用户数量。例如总共有4个用户。我想要的结果是:2个用户在Company1,2个用户在Company2。 - Adolfo Luzardo Cabrera
可能是https://dev59.com/R2Up5IYBdhLWcg3wf3ys的重复问题。 - WebInsight
1
你可以使用 UNION 进行合并。 - syck
1个回答

1
使用条件聚合:
SELECT COUNT(CASE WHEN u0_.email LIKE '%@company1.com' THEN 1 END) as First_cnt,
        COUNT(CASE WHEN u0_.email LIKE '%@company2.com' THEN 1 END) as First_cnt
FROM user u0_ 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接