2016-04-19 44 views
0

計數空值我有這樣一個查詢:主義不是比較

$thism = new \DateTime('first day of this month midnight'); 

    $parameters = array('thism' => $thism, 'user' => $user,'status'=>1); 

    return $this->createQueryBuilder('q') 
     ->select('count(q)') 
     ->where('q.createdAt > :thism') 
     ->andWhere('q.user = :user') 
     ->andWhere('q.completed != :status') 
     ->setParameters($parameters) 
     ->getQuery() 
     ->getSingleScalarResult(); 

這應該算從本月起我所有的不完整的對象。問題出在q.completed != :status。這不會計算具有completed=NULL的對象。完成是一個布爾值

class Quote 
{ 

    /** 
    * @var boolean 
    * 
    * @ORM\Column(name="completed", type="boolean", nullable=true) 
    */ 
    private $completed; 
} 

難道我做錯了什麼,或者爲什麼不主義算NULL作爲比真有什麼不同?

我試過用1,true,TRUE替換'status'=>1,它們都帶有和沒有引號,仍然沒有效果。

格式化的查詢:

SELECT count(q0_.id) AS sclr_0 FROM quote q0_ WHERE q0_.created_at > ? AND q0_.user_id = ? AND q0_.completed <> ? 
Parameters: ['2016-04-01 00:00:00', '1', 1] 

SELECT count(q0_.id) AS sclr_0 FROM quote q0_ WHERE q0_.created_at > '2016-04-01 00:00:00' AND q0_.user_id = '1' AND q0_.completed <> 1; 
+0

生成的SQL看起來像什麼? (你可以在日誌中看到它) – Miro

+0

@Miro將它添加到問題中。 –

回答

1

空在MySQL中是不一樣的真或假。 的更多信息是on MySQL official site.

你翻譯查詢SQL將是:

SELECT count(1) 
FROM <some table> 
WHERE completed != 1 
AND createdAt > '01042016 00:00' 
AND user = 'some_user' 

如果您想查詢空值太SQL,你應該有一個查詢,如:

SELECT count(1) 
FROM <some table> 
WHERE 
    (completed != 1 or completed is NULL) 
AND createdAt > '01042016 00:00' 
AND user = 'some_user' 

如果默認情況下需要此列以獲得某些值 - 您可以在CREATE TABLE語句中使用default 0(或任何其他值)來定義它,如下所示:

CREATE TABLE my_table(
    ... 

    completed tinyint(1) default 0 
    .... 
) 

如果你這樣做 - 你的查詢應該沒有改變。

+1

'Null在MySQL中與真或假不一樣'。奇怪的是,我不知道。如果不注意的話,這可能會導致很多查詢。 –

+0

如果需要將空值視爲0,則應設置默認值 – Tata

+0

但對於已存在的空值,在架構更新後值將保留爲空。 –