【问题标题】:Merge loop of SQL queries into one SQL query将 SQL 查询循环合并为一个 SQL 查询
【发布时间】:2016-07-26 22:10:00
【问题描述】:

我在 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;

我要合并的 2 个 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 连接起来。
  • 我不确定,但如果我将所有u0_.email LIKE '%@somecompany.com' 条件放入一个数组并与OR 一起加入它们。我将得到的结果是任何公司的用户数量。例如总共 4 个用户。我想要这个结果:2 个用户 Company1 和 2 个用户 Company2。
  • 你可以UNION他们。

标签: php mysql sql-server symfony


【解决方案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_ 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    相关资源
    最近更新 更多