【问题标题】:COALESCE not returning an extra row for Null and 0 valuesCOALESCE 没有为 Null 和 0 值返回额外的行
【发布时间】:2021-12-04 19:41:59
【问题描述】:

目前我有 2 个表,第一个表显示状态计数,refno。和agent_id(负责人)和第二个表有一个id和agent_name。因此,要在 refno 旁边引用特定代理。在表1中,可以通过agent表的id来引用。

Dbfiddle:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=8b92273ef2bb807e3a23e4b8a2ce6d6b

现在我发现我的一些房源的 agent_id 为 0 和 null,这在我的代理表中没有引用。所以在这里我使用 COALESCE 添加一个名为 Unassigned 的额外行,并在该列中插入所有 agent_id 为 0 或 null 的变量。我已经在我的 codeigniter 模型中尝试了同样的方法:

function get_totalagentstatus(){
$this->db->select("SUM(CASE WHEN t.status = 'D' THEN 1 END) AS draft,
SUM(CASE WHEN t.status = 'N' THEN 1 END) AS unpublish,
SUM(CASE WHEN t.status = 'Y' THEN 1 END) AS publish,
SUM(CASE WHEN t.status = 'U' THEN 1 END) AS action,
SUM(CASE WHEN t.status = 'L' THEN 1 END) AS unlisted,
SUM(CASE WHEN t.status = 'S' THEN 1 END) AS sold,
SUM(CASE WHEN t.status = 'T' THEN 1 END) AS let, COALESCE(c.display_name,'Unassigned'),
SUM(t.status = 'D') +SUM(t.status = 'N') + SUM(t.status = 'Y') + SUM(t.status = 'U') +
        SUM(t.status = 'L' ) + SUM(t.status = 'S' )+ SUM(t.status = 'T' ) AS total, t.agent_id, c.display_name");
$this->db->from('crm_listings t');
$this->db->join('crm_clients_users c','t.agent_id = c.id');
$this->db->where('archive="N"');
$this->db->group_by('COALESCE(c.display_name,"Unassigned")');
$results = $this->db->get();
  return $results;
}

控制器类:

$content['total_agent_status'] = $this->leads_model->get_totalagentstatus()->result();

查看类:

<?php
            foreach($total_agent_status as $row ){
              $draft = $row->draft ? $row->draft : 0;
              $unpublish = $row->unpublish ? $row->unpublish : 0;
              $publish = $row->publish ? $row->publish : 0;
              $action = $row->action ? $row->action : 0;
              $unlisted = $row->unlisted ? $row->unlisted : 0;
              $sold = $row->sold ? $row->sold : 0;
              $let = $row->let ? $row->let : 0; 
              $total = $row->total ? $row->total : 0;                           
          ?>
          <tr>
                <td><?= $row->display_name ?></td>
                <td><?= $draft ?></td>
                <td><?= $unpublish ?></td>
                <td><?= $publish ?></td>
                <td><?= $action ?></td>
                <td><?= $unlisted ?></td>
                <td><?= $sold ?></td>
                <td><?= $let ?></td>
                <td><?= $total ?></td>
          </tr>

我已经完成了 $this->db->last_query 并得到了以下查询:

SELECT SUM(CASE WHEN t.status = 'D' THEN 1 END) AS draft, 
SUM(CASE WHEN t.status = 'N' THEN 1 END) AS unpublish, 
SUM(CASE WHEN t.status = 'Y' THEN 1 END) AS publish, 
SUM(CASE WHEN t.status = 'U' THEN 1 END) AS action, 
SUM(CASE WHEN t.status = 'L' THEN 1 END) AS unlisted, 
SUM(CASE WHEN t.status = 'S' THEN 1 END) AS sold, 
SUM(CASE WHEN t.status = 'T' THEN 1 END) AS let, 
COALESCE(c.display_name, 'Unassigned'), SUM(t.status = 'D') 
+SUM(t.status = 'N') + SUM(t.status = 'Y') + SUM(t.status = 'U') 
+ SUM(t.status = 'L' ) + SUM(t.status = 'S' )+ SUM(t.status = 'T' ) AS total, 
`t`.`agent_id`, `c`.`display_name` FROM `crm_listings` `t` 
JOIN `crm_clients_users` `c` ON `t`.`agent_id` = `c`.`id` 
WHERE `archive` = "N" GROUP BY COALESCE(c.display_name, "Unassigned")

现在这将返回除我想要的未分配行之外的所有内容。我还在我的 phpmyadmin 中输入了这个来查看结果,它也没有在那里返回它,而是显示带有这些标题的输出,并且这里的任何条目中都没有 Unassigned:

【问题讨论】:

    标签: php mysql codeigniter


    【解决方案1】:

    如果您希望在结果中出现在agents 中没有匹配的idlistings 行,则您需要将listingsagents 进行LEFT 连接。
    此外,您必须按COALESCE(t.agent_id, 0) 分组以涵盖agent_id 中的0null 两种情况:

    SELECT COALESCE(c.name, 'Unassigned') name,
           SUM(CASE WHEN t.status = 'D' THEN 1 ELSE 0 END) AS draft, 
           SUM(CASE WHEN t.status = 'N' THEN 1 ELSE 0 END) AS unpublish, 
           SUM(CASE WHEN t.status = 'Y' THEN 1 ELSE 0 END) AS publish, 
           SUM(CASE WHEN t.status = 'U' THEN 1 ELSE 0 END) AS action, 
           SUM(CASE WHEN t.status = 'L' THEN 1 ELSE 0 END) AS unlisted, 
           SUM(CASE WHEN t.status = 'S' THEN 1 ELSE 0 END) AS sold, 
           SUM(CASE WHEN t.status = 'T' THEN 1 ELSE 0 END) AS let,
           SUM(CASE WHEN t.status IN ('D', 'N', 'Y', 'U', 'L', 'S', 'T') THEN 1 ELSE 0 END) AS total 
    FROM listings t LEFT JOIN agents c 
    ON t.agent_id = c.id
    GROUP BY COALESCE(t.agent_id, 0), c.name
    ORDER BY c.name IS NULL, c.name;
    

    我在所有CASE 表达式中添加了ELSE 0 部分,以便您在结果中获得0s 而不是NULLs,并将表达式更改为total 列的仅1 SUM,方法是使用运算符IN,但如果'D'、'N'、'Y'、'U'、'L'、'S'和'T'是status唯一可能的值,那么你可以只使用@ 987654341@:

    SELECT COALESCE(c.name, 'Unassigned') name,
           SUM(CASE WHEN t.status = 'D' THEN 1 ELSE 0 END) AS draft, 
           SUM(CASE WHEN t.status = 'N' THEN 1 ELSE 0 END) AS unpublish, 
           SUM(CASE WHEN t.status = 'Y' THEN 1 ELSE 0 END) AS publish, 
           SUM(CASE WHEN t.status = 'U' THEN 1 ELSE 0 END) AS action, 
           SUM(CASE WHEN t.status = 'L' THEN 1 ELSE 0 END) AS unlisted, 
           SUM(CASE WHEN t.status = 'S' THEN 1 ELSE 0 END) AS sold, 
           SUM(CASE WHEN t.status = 'T' THEN 1 ELSE 0 END) AS let,
           COUNT(*) AS total 
    FROM listings t LEFT JOIN agents c 
    ON t.agent_id = c.id
    GROUP BY COALESCE(t.agent_id, 0), c.name
    ORDER BY c.name IS NULL, c.name;
    

    请参阅demo

    【讨论】:

    猜你喜欢
    • 2016-09-30
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    相关资源
    最近更新 更多