2013-05-31 154 views
0

我很難得到一個PDO數據庫類,我正在寫關於GROUP BY子句的查詢。PDO GROUP BY不返回結果

例如,我想檢索數據庫中的文章列表,但文章使用多對多關係鏈接到標籤。

即文章>文章標籤鏈接<標籤

我試圖運行查詢很簡單:

SELECT * FROM articles, article-tag-link, tags WHERE articles.articleID = article-tag-link.articleID AND tags.tagID = article-tag-link.tagID GROUP BY articles.articleID LIMIT 3; 

我用準備好的語句來執行與PDO查詢,並且我知道沒有GROUP BY的簡單查詢完美地工作,因爲它在其他地方使用時沒有問題。

所以,當它涉及到執行查詢,我做:

$result = $stmt->execute(); 
$results = $stmt->fetchAll(PDO::FETCH_ASSOC); 

這將返回我想要的結果,但他們沒有正確分組。即一個可能有3個標籤的文章將出現三次(因爲在技術上有三個滿足查詢的記錄 - 不包括GROUP BY)。所以就好像GROUP BY被忽略了一樣。

我遇到

$results = $stmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP); 
$results = array_map('reset', $results); 

但其行爲就像奇怪。這將只返回一個結果(它不會返回第一篇文章三次 - 每個應用的標籤一次),但它會停在那一個結果 - 它不會繼續讀取兩個結果。

任何人都可以解釋如何讓它獲取滿足查詢的三個唯一記錄嗎?

+0

我設法找到解決自己和會我會爲其他可能犯過同樣錯誤的人寫信。正如我寫過自己的PDO封裝器一樣,我將所有的值傳遞給通過方法進行查詢。該方法負責準備聲明並約束所有內容。我正在做的是意外地試圖綁定導致問題的GROUP BY值。只要記住不要綁定這個,並將GROUP BY作爲格式化查詢的常規部分。 – Amo

回答

0

可以使用INNER JOIN代替

試試這個

SELECT * FROM articles a 
    INNER JOIN article-tag-link atl 
     ON a.articleID = atl.articleID 
    INNER JOIN tags t 
     ON t.tagID = atl.tagID 
    GROUP BY a.articleID 
    LIMIT 3; 

試試這個

$sth->fetchAll(); 
+0

我爲了簡化的例子而編寫的查詢本身,如果我直接在mySQL中運行它,則不會出現問題。這是PDO取得似乎是問題的結果的方式。 – Amo

+0

嘗試獲取像我更新的答案 –

+0

我改變$ results = $ stmt-> fetchAll(PDO :: FETCH_ASSOC); to $ results = $ stmt-> fetchAll();但它仍然不會獲取3個結果..只有一個 – Amo

0

你spesific秀場

SELECT articles.articleID FROM articles, article-tag-link, tags WHERE articles.articleID = article-tag-link.articleID AND tags.tagID = article-tag-link.tagID GROUP BY articles.articleID LIMIT 3;