2017-08-03 89 views
3

我有一份準備好的聲明:準備PHP SQL語句沒有GROUP返回false BY子句

if ($statement = $this->connection->prepare("SELECT question_type, count(*) AS `count` FROM (SELECT question.*, left(question_body, locate('between', question_body)-2) AS question_type FROM question) q WHERE (q.question_type = ? AND q.response_value_id = ?)")) { 
    $statement->bind_param("si", $question_type, $response_value_id); 
    $statement->execute(); 
    return $statement->get_result()->fetch_assoc(); 
} else { 
    var_dump($this->db->error); 
} 

下面是該查詢:

SELECT question_type, count(*) AS `count` FROM 
(SELECT question.*, left(question_body, locate('between', question_body) - 2) 
AS question_type FROM question) 
q WHERE q.question_type = 'Did you return home' AND q.response_value_id = 4 

問題: 出於某種原因,準備好的語句返回假,儘管我試圖在phpMyAdmin上運行查詢,並且它完美地工作。 如果我執行準備好的語句時沒有警惕錯誤,我會收到錯誤:bind_param() on boolean

如果我添加到查詢的末尾:

GROUP BY q.question_type 

然後一切正常。但是,這不是我想要的,因爲它對計數返回null而不是0,而且我也不明白它是如何在沒有GROUP BY的情況下工作的。

+0

如果你想通過question_type計數你需要添加GROUP BY q.question_type。否則在count(*) –

回答

0

未經被depracted並在最近的MySQL版本(5.7)的組使用聚合函數是不允許 檢查你的權利versione反正通過 例如,嘗試使用組並沒有提及列永遠agregated功能:

"SELECT question_type, count(*) AS `count` 
    FROM (
     SELECT question.*, left(question_body, locate('between', question_body)-2) AS question_type 
     FROM question) q 
    WHERE q.question_type = ? AND q.response_value_id = ? 
    GROUP BY question_type)" 

"SELECT min(question_type), count(*) AS `count` 
    FROM (
     SELECT question.*, left(question_body, locate('between', question_body)-2) AS question_type 
     FROM question) q 
    WHERE (q.question_type = ? AND q.response_value_id = ?)" 
+0

之前取出question_type謝謝你的迴應,這非常有道理。它解釋了爲什麼一切工作在我的桌面(舊版本的SQL),但我一直在遇到最新版本的問題。你給的第一個答案在第6行返回語法錯誤,你可以編輯它嗎?我試圖分離BY的question_type,它不起作用。謝謝! –

+0

回答更新..刪除無用( – scaisEdge

0
如果你想通過question_type你需要添加GROUP BY q.question_type計數

。否則,請在select語句中的count(*)之前取出question_type。試試這個:

SELECT count(*) AS `count` FROM 
(SELECT question.*, left(question_body, locate('between', question_body)-2) 
AS question_type FROM question) 
q WHERE q.question_type = 'Did you return home' AND q.response_value_id = 4 
0

每當除了顯示等領域(在你的例子question_type),你必須使用 GROUP BY使用聚合函數。

您可以在使用GROUP BY時計算的字段上使用ISNULL