将mysql查询重构为一个,因此不需要2个连接

问题描述 投票:0回答:1

是否有一种方法可以将这些查询组合成一个查询?这样我就不会在条件匹配的情况下创建另一个连接。

$sql1 = "select status,ext_status from dnd where ext =:ext  order by no desc limit 1 ";
$query =  $this->db->prepare($sql1);
$query->execute(array(':ext' => $ext));
$result = $query->fetch();

if($result['status'] != '')
{
    $status_no = $result['status'];
}
else
{
    if($result['ext_status'] == '51')
    {
        $sql2 = "select ext,status from dnd where ext =:ext2 and status != '' order by no desc limit 1";
        $query2 =  $this->db->prepare($sql2);
        $query2->execute(array(':ext2' => $ext));
        $result2 = $query2->fetch();

        if($result2) {
            $status_no = $result2['status'];
        }
    }
    else
    {
        $status_no = $statusActual;
    }
}

return $status_no;

编辑:这是表中的示例数据:

+-------+---------------------+---------------------+------+--------+------+------+------+------------+---------------------+-------------+-------------+------+------+----------+
| no    | date                | date_ext            | ext  | status | etc1 | etc2 | etc3 | ext_status | datetime            | answer_time | hangup_time | src  | did  | uniqueid |
+-------+---------------------+---------------------+------+--------+------+------+------+------------+---------------------+-------------+-------------+------+------+----------+
| 19103 | 2019-01-01 02:59:46 | 2019-01-01 02:59:46 | 6603 |        | NULL | NULL | NULL | 52         | 2019-01-01 02:59:46 | NULL        | NULL        | NULL | NULL | NULL     |
| 19104 | 2019-01-01 08:56:37 | 2019-01-01 08:56:37 | 6601 |        | NULL | NULL | NULL | 52         | 2019-01-01 08:56:37 | NULL        | NULL        | NULL | NULL | NULL     |
| 19105 | 2019-01-01 08:56:38 | 2019-01-01 08:56:38 | 6601 |        | NULL | NULL | NULL | 51         | 2019-01-01 08:56:38 | NULL        | NULL        | NULL | NULL | NULL     |
| 19106 | 2019-01-01 09:19:00 | 0000-00-00 00:00:00 | 6601 | 31     | NULL | NULL | NULL | 51         | 2019-01-01 09:19:00 | NULL        | NULL        | NULL | NULL | NULL     |
| 19107 | 2019-01-01 10:24:19 | 0000-00-00 00:00:00 | 6601 | 32     | NULL | NULL | NULL | 51         | 2019-01-01 10:24:19 | NULL        | NULL        | NULL | NULL | NULL     |
| 19108 | 2019-01-01 11:57:36 | 2019-01-01 11:57:36 | 6601 | 21     | NULL | NULL | NULL | 51         | 2019-01-01 11:57:36 | NULL        | NULL        | NULL | NULL | NULL     |
| 19109 | 2019-01-01 13:05:12 | 2019-01-01 13:05:12 | 6601 | 22     | NULL | NULL | NULL | 51         | 2019-01-01 13:05:12 | NULL        | NULL        | NULL | NULL | NULL     |
| 19110 | 2019-01-01 16:59:20 | 2019-01-01 16:59:20 | 6601 |        | NULL | NULL | NULL | 52         | 2019-01-01 16:59:20 | NULL        | NULL        | NULL | NULL | NULL     |
| 19111 | 2019-01-01 17:00:26 | 2019-01-01 17:00:26 | 6601 |        | NULL | NULL | NULL | 51         | 2019-01-01 17:00:26 | NULL        | NULL        | NULL | NULL | NULL     |
| 19112 | 2019-01-01 17:15:20 | 2019-01-01 17:15:20 | 6601 | 11     | NULL | NULL | NULL | 51         | 2019-01-01 17:15:20 | NULL        | NULL        | NULL | NULL | NULL     |
+-------+---------------------+---------------------+------+--------+------+------+------+------------+---------------------+-------------+-------------+------+------+----------+

假设,我想获取ext = 6601的状态,我目前这样查询:

select status,ext_status from dnd where ext =:ext  order by no desc limit 1

如果结果的状态为!=”(空),我将使用结果的查询,但是如果status ==''和ext_status =='51',我需要使用它重新查询以获取状态:

select ext,status from dnd where ext =:ext2 and status != '' order by no desc limit 1

我对查询有一个想法,但不幸的是,它不起作用。

SELECT 
    CASE ext_status = 51 THEN (SELECT STATUS FROM dnd WHERE ext = '8001' AND STATUS != '' ORDER BY NO DESC LIMIT 1)
    ELSE STATUS END AS test
FROM dnd WHERE ext = '8001'  ORDER BY NO DESC LIMIT 1
php mysql
1个回答
0
投票
SELECT
   d.status,
   d.ext_status,
   COALESCE(d2.status, d.status) test
FROM dnd d
LEFT JOIN (
   SELECT ext, status 
   FROM dnd
   ORDER BY no DESC) d2
ON d.ext = d2.ext
   AND d2.status != ''
   AND d.ext_status = 51
WHERE d.ext = :ext 
ORDER BY no DESC
LIMIT 1
© www.soinside.com 2019 - 2024. All rights reserved.