Php 避免查询结果为空

Php 避免查询结果为空,php,mysql,Php,Mysql,假设这样 用户表: [身份证][邮寄][通行证] 事件表: [id][uid][date][content] 投票表 [uid][hid][type][datetime] 1个用户可以有0个或多个投票,1个用户可以有0个或多个投票 我想得到一个特定项目的总票数 SELECT H.*, SUM(CASE WHEN V.type='C' THEN 1 ELSE 0 END) AS upvotes, SUM(CASE WHEN V.type='R' THEN 1 ELSE 0 END) AS d

假设这样

用户表: [身份证][邮寄][通行证]

事件表: [id][uid][date][content]

投票表 [uid][hid][type][datetime]

1个用户可以有0个或多个投票,1个用户可以有0个或多个投票

我想得到一个特定项目的总票数

SELECT
 H.*,
 SUM(CASE WHEN V.type='C' THEN 1 ELSE 0 END) AS upvotes,
 SUM(CASE WHEN V.type='R' THEN 1 ELSE 0 END) AS downvotes
FROM
 happens H
LEFT JOIN
 votes AS V
 ON V.hid = H.id
WHERE
 H.uid = :uid
问题是,如果在一个事件上没有投票关联,我从mysql获得一个空行,不是空的,而是空的

如何避免这个空结果

[编辑]

有些人尝试:

基本的

结果->空

所有其他尝试的总和,计数,有ect给出:

[id] [uid] [what] [latitude] [longitude] [date] [time] [hide] [upvotes] [downvotes]
NULL NULL   NULL    NULL    NULL    NULL    NULL    NULL    0   0

使用
HAVING
检查空值

SELECT
 H.*,
 SUM(CASE WHEN V.type='C' THEN 1 ELSE 0 END) AS upvotes,
 SUM(CASE WHEN V.type='R' THEN 1 ELSE 0 END) AS downvotes
FROM
 happens H
LEFT JOIN
 votes AS V
 ON V.hid = H.id
WHERE
 H.uid = :uid
HAVING upvotes IS NOT NULL

使用
HAVING
检查空值

SELECT
 H.*,
 SUM(CASE WHEN V.type='C' THEN 1 ELSE 0 END) AS upvotes,
 SUM(CASE WHEN V.type='R' THEN 1 ELSE 0 END) AS downvotes
FROM
 happens H
LEFT JOIN
 votes AS V
 ON V.hid = H.id
WHERE
 H.uid = :uid
HAVING upvotes IS NOT NULL

如果将左连接更改为内部连接(或仅连接),则只能获得在投票表中至少有1条关联记录的记录:

SELECT
 H.*,
 SUM(CASE WHEN V.type='C' THEN 1 ELSE 0 END) AS upvotes,
 SUM(CASE WHEN V.type='R' THEN 1 ELSE 0 END) AS downvotes
FROM
 happens H
INNER JOIN
 votes AS V
 ON V.hid = H.id
WHERE
 H.uid = :uid
查看有关不同联接类型的信息

编辑:

好的,所以要得到所有结果,但是对于那些没有投票权的人,使用0尝试(添加合并):


如果将左连接更改为内部连接(或仅连接),则只能获得在投票表中至少有1条关联记录的记录:

SELECT
 H.*,
 SUM(CASE WHEN V.type='C' THEN 1 ELSE 0 END) AS upvotes,
 SUM(CASE WHEN V.type='R' THEN 1 ELSE 0 END) AS downvotes
FROM
 happens H
INNER JOIN
 votes AS V
 ON V.hid = H.id
WHERE
 H.uid = :uid
查看有关不同联接类型的信息

编辑:

好的,所以要得到所有结果,但是对于那些没有投票权的人,使用0尝试(添加合并):


如果on条件不匹配,Left Join将返回左侧的所有行,如果on条件不匹配,Left Join将返回右侧的空值。

如果on条件不匹配,Left Join将返回左侧的所有行。

使用2语句解决

  • 首先选择所有发生的事件

  • 第二步,为每个事件选择所有投票,并合并值

  • 以下是我的php happenModel类的解决方案:

    public function getUserHappensWithVotes() {
    $selectQuery = <<<QUERY
    SELECT
     SUM(CASE WHEN V.type='C' THEN 1 ELSE 0 END) AS upvotes,
     SUM(CASE WHEN V.type='R' THEN 1 ELSE 0 END) AS downvotes
    FROM
     votes V
    WHERE
     V.uid = :uid
    AND
     V.hid = :hid
    QUERY;
    
        // get all happen as array of class
        $userHappens = $this->userHappens;
        // empty container
        $happenWithVotes = array();
    
        foreach( $userHappens AS $happen ) {
            $sql = $this->pdo->prepare( $selectQuery );
            $sql->execute( array( ':uid'=>$happen->uid, ':hid'=>$happen->id ) );
    
            // fetching the count of up and down votes of every happen
            $votes = $sql->fetch( PDO::FETCH_ASSOC );
            // merging happen class as array with votes
            $happen = array_merge( (array) $happen, $votes );
    
            // rebuild the userHappen array
            $happenWithVotes[] = (object) $happen;
        }
    
        if ( $this->encoder ) {
            return $this->encoder->setData( $this->parse( $happenWithVotes ) )->encode();
            } else {
            return $this->parse( $happenWithVotes );
        }
    }
    
    公共函数getUserHappensWithVoces(){
    $selectQuery=prepare($selectQuery);
    $sql->execute(数组(':uid'=>$appoint->uid':hid'=>$appoint->id));
    //统计每一次投票的上下票数
    $vots=$sql->fetch(PDO::fetch_ASSOC);
    //将类合并为带有投票的数组
    $occure=array\u merge((array)$occure$vows);
    //重新生成useroccure数组
    $HappenWithVoces[]=(对象)$Cappen;
    }
    如果($此->编码器){
    返回$this->encoder->setData($this->parse($happenWithVotes))->encode();
    }否则{
    返回$this->parse($happenWithVotes);
    }
    }
    
    使用2语句解决

  • 首先选择所有发生的事件

  • 第二步,为每个事件选择所有投票,并合并值

  • 以下是我的php happenModel类的解决方案:

    public function getUserHappensWithVotes() {
    $selectQuery = <<<QUERY
    SELECT
     SUM(CASE WHEN V.type='C' THEN 1 ELSE 0 END) AS upvotes,
     SUM(CASE WHEN V.type='R' THEN 1 ELSE 0 END) AS downvotes
    FROM
     votes V
    WHERE
     V.uid = :uid
    AND
     V.hid = :hid
    QUERY;
    
        // get all happen as array of class
        $userHappens = $this->userHappens;
        // empty container
        $happenWithVotes = array();
    
        foreach( $userHappens AS $happen ) {
            $sql = $this->pdo->prepare( $selectQuery );
            $sql->execute( array( ':uid'=>$happen->uid, ':hid'=>$happen->id ) );
    
            // fetching the count of up and down votes of every happen
            $votes = $sql->fetch( PDO::FETCH_ASSOC );
            // merging happen class as array with votes
            $happen = array_merge( (array) $happen, $votes );
    
            // rebuild the userHappen array
            $happenWithVotes[] = (object) $happen;
        }
    
        if ( $this->encoder ) {
            return $this->encoder->setData( $this->parse( $happenWithVotes ) )->encode();
            } else {
            return $this->parse( $happenWithVotes );
        }
    }
    
    公共函数getUserHappensWithVoces(){
    $selectQuery=prepare($selectQuery);
    $sql->execute(数组(':uid'=>$appoint->uid':hid'=>$appoint->id));
    //统计每一次投票的上下票数
    $vots=$sql->fetch(PDO::fetch_ASSOC);
    //将类合并为带有投票的数组
    $occure=array\u merge((array)$occure$vows);
    //重新生成useroccure数组
    $HappenWithVoces[]=(对象)$Cappen;
    }
    如果($此->编码器){
    返回$this->encoder->setData($this->parse($happenWithVotes))->encode();
    }否则{
    返回$this->parse($happenWithVotes);
    }
    }
    

    试试这个,不要使用
    SUM
    使用
    COUNT
    。例如,
    COUNT(当V.type='C'然后1 ELSE NULL END时的情况)
    id uid什么纬度经度日期时间隐藏向上投票向下投票NULL 0尝试此操作,而不是使用
    SUM
    使用
    COUNT
    。例如,
    COUNT(当V.type='C'然后1 ELSE NULL END时的情况)
    id uid什么纬度经度日期时间隐藏向上投票向下投票NULL 0 0 NULL值在结果集中,不在投票表中。。。查询返回空字段空值在结果集中,而不是投票表中。。。查询返回null FIELDSALREADY try with INNER JOIN,但结果始终相同。。。带有NULL的行values@Mindexperiment你能发布一些结果样本吗?已经尝试了内部连接,但总是相同的结果。。。带有NULL的行values@Mindexperiment你能发布一些结果样本吗?试一下,但结果相同。。。也许问题出在H.*???因为我试图从一个没有添加事件的用户那里得到结果…对于一个用户,如果在上面的事件表中没有任何内容,那么应该得到一个空结果。即使在“发生”中没有记录,也可以为用户返回一行,投票计数为0,但不会有任何与之关联的“发生”数据(所有“发生”字段都将为空),因此我不确定您试图执行的操作。用户可以添加“发生”,每个“发生”都可以由其他用户投票。我需要在用户页面上显示每个用户发生的事件。如果发生有一些投票关联,显示上升投票和下降投票的数量。dianuj解决方案有效,但它只给我1行,即使一个用户有许多发生..mmmmmm只是尝试,但相同的结果。。。也许问题出在H.*???因为我试图从一个没有添加事件的用户那里得到结果…对于一个用户,如果在上面的事件表中没有任何内容,那么应该得到一个空结果。即使在“发生”中没有记录,也可以为用户返回一行,投票计数为0,但不会有任何与之关联的“发生”数据(所有“发生”字段都将为空),因此我不确定您试图执行的操作。用户可以添加“发生”,每个“发生”都可以由其他用户投票。我需要在用户页面上显示每个用户发生的事件。如果发生有一些投票关联,请显示上升投票和下降投票的数量。dianuj解决方案有效,但即使一个用户有许多发生,它也只会给我一行。嗯,对不起,现在对于有一些发生和一些投票的用户,我只得到1个r
    public function getUserHappensWithVotes() {
    $selectQuery = <<<QUERY
    SELECT
     SUM(CASE WHEN V.type='C' THEN 1 ELSE 0 END) AS upvotes,
     SUM(CASE WHEN V.type='R' THEN 1 ELSE 0 END) AS downvotes
    FROM
     votes V
    WHERE
     V.uid = :uid
    AND
     V.hid = :hid
    QUERY;
    
        // get all happen as array of class
        $userHappens = $this->userHappens;
        // empty container
        $happenWithVotes = array();
    
        foreach( $userHappens AS $happen ) {
            $sql = $this->pdo->prepare( $selectQuery );
            $sql->execute( array( ':uid'=>$happen->uid, ':hid'=>$happen->id ) );
    
            // fetching the count of up and down votes of every happen
            $votes = $sql->fetch( PDO::FETCH_ASSOC );
            // merging happen class as array with votes
            $happen = array_merge( (array) $happen, $votes );
    
            // rebuild the userHappen array
            $happenWithVotes[] = (object) $happen;
        }
    
        if ( $this->encoder ) {
            return $this->encoder->setData( $this->parse( $happenWithVotes ) )->encode();
            } else {
            return $this->parse( $happenWithVotes );
        }
    }