【问题标题】:Count then group 2 columns from SQL Table对 SQL 表中的 2 列进行计数然后分组
【发布时间】:2013-11-24 19:14:04
【问题描述】:

我正在使用这样的表结构:

departure | destination | Type    | Pilot
EDDK        EDDM          flight    name
EDDK        EDDI          flight    name
EDDI        EDDK          flight    name
EDDK        EDDP          flight    name
EDDM        EDDK          flight    name
EDDF        EDDK          flight    name
EDDF        EDDI          flight    name

and so on...

现在我正在使用这样的 codeigniter sql 查询:

$query = $this->db->select('departure, COUNT(departure) as zaehler', False)
                    ->from('tablename')
                    ->where('Pilot', $user)
                    ->where('Type', 'flight')
                    ->group_by('departure')
                    ->order_by('zaehler', 'DESC')
                    ->get();

return $query->result();

这会产生一个预期的数组:

Array
(
   [0] => stdClass Object
      (
        [departure] => EDDK
        [zaehler] => 3
     )

   [1] => stdClass Object
      (
        [departure] => EDDF
        [zaehler] => 2
      )

   [2] => stdClass Object
      (
        [departure] => EDDM
        [zaehler] => 1
      )
   [3] => stdClass Object
      (
        [departure] => EDDI
        [zaehler] => 1
      )

我也在对“目的地”使用相同的查询。 是否有可能在一次中获得这 2 个查询的结果? 所以结果是这样的?

Array
  (
   [0] => EDDK
      (
        [departure] => 3
        [destination] => 3
     )

   [1] => EDDF
      (
        [departure] => 2
        [destination] => 0
      )

   [2] => EDDM
      (
        [departure] => 1
        [destination] => 1
      )
   [3] => EDDI
      (
        [departure] => 1
        [destination] => 2
      )
   [4] => EDDP
      (
        [departure] => 0
        [destination] => 1
      )

【问题讨论】:

    标签: php mysql sql codeigniter


    【解决方案1】:

    我会让你把它翻译成你的 php 格式,但是查询的一般形式是这样的:

    SELECT Departure, DepCnt, DesCnt FROM
    (SELECT Departure, COUNT(Departure) AS DepCnt FROM T
    GROUP BY Departure)
    INNER JOIN
    (SELECT Destination, COUNT(Destination) AS DesCnt FROM T
    GROUP BY Destination)
    ON Departure = Destination
    

    如评论中所述,上述解决方案将在没有出发地或没有目的地时省​​略位置。下面的修改处理这个问题。

    SELECT Loc, COALESCE(DepCnt,0), COALESCE(DesCnt,0) FROM
    (SELECT DISTINCT Departure AS Loc FROM T
    UNION
    SELECT DISTINCT Destination FROM T)
    LEFT OUTER JOIN
    (SELECT Departure, COUNT(Departure) AS DepCnt FROM T
    GROUP BY Departure) ON Departure = Loc
    LEFT OUTER JOIN
    (SELECT Destination, COUNT(Destination) AS DesCnt FROM T
    GROUP BY Destination) ON Destination = Loc
    

    【讨论】:

    • 出发或目的地为 0 时不计算在内
    • @TNT_Larsn 你是对的。我添加了一个额外的解决方案来解决这个问题。
    【解决方案2】:
    $sqlQuery = "SELECT distinct departure,";
    $sqlQuery .= "  (SELECT count(*) FROM tablename b WHERE b.departure = a.departure) as 'departure',";
    $sqlQuery .= "  (SELECT count(*) FROM tablename b WHERE b.destination = a.destination) as 'destination'";
    $sqlQuery .= "FROM tablename a ";
    
    $query = $this->db->query($sqlQuery);
    
    return $query->result();
    

    这将计算每个“目的地”的所有出发和目的地。您可以随意添加“WHERE”语法或以自己的方式进行改进

    【讨论】:

    • 我认为对子查询应用 distinct 应该会导致语法错误。
    • 我在几秒前做了一个子查询:sqlfiddle.com/#!2/39f41/19,你的意思是什么错误?
    猜你喜欢
    • 2017-05-17
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    相关资源
    最近更新 更多