Php 避免查询结果为空
假设这样 用户表: [身份证][邮寄][通行证] 事件表: [id][uid][date][content] 投票表 [uid][hid][type][datetime] 1个用户可以有0个或多个投票,1个用户可以有0个或多个投票 我想得到一个特定项目的总票数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
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语句解决
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语句解决
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 );
}
}