2011-09-04 51 views
-1

我認爲如果我解釋我正在嘗試做什麼會更容易。如何在MySQLi提取()循環中執行查詢PHP

說我有2個表格,一個是頁面,另一個是視圖。

每個頁面都有一個唯一的ID,當頁面被訪問時,一個記錄被輸入到視圖中。

假設我想將頁面和頁面的總視圖一起列出。

所以我會有一個查詢選擇從數據庫中的頁面,並使用循環來顯示它們,但我也想知道它的總視圖,並顯示該頁面名稱旁邊的數字。

我該怎麼做到這一點?

當我運行一個獲取循環內的查詢時,我得到以下錯誤:

Commands out of sync; you can't run this command now 

感謝。

+0

請發表您的代碼,這樣我們就可以明白爲什麼這個錯誤可能存在的 – canadiancreed

回答

2

使用JOIN,是這樣的:

SELECT page.*, view.* 
FROM page 
LEFT OUTER JOIN view 
ON view.page_id = page.id 

通過使用LEFT OUTER JOIN,沒有意見的頁面仍然會被退回,但view列將NULL

這將在一次查詢中爲您提供所有需要的結果。數據庫引擎執行關聯表的工作通常比自己做的更好。然後你只需要一次訪問數據庫引擎,它就可以比你的代碼更快地執行關聯。


得到計數,你可以做一個連接,與分組基於的(這可能是一個醜陋的查詢,這取決於你的數據庫引擎)或使用子查詢的查詢:

SELECT 
    page.*, 
    (
     SELECT COUNT(view.id) 
     FROM view 
     WHERE view.page_id = page.id 
    ) AS view_count 
FROM page 

組,由變種會是這個樣子:

SELECT page.*, COUNT(view.id) 
FROM page 
LEFT OUTER JOIN view 
ON view.page_id = page.id 
GROUP BY page.id 

根據您的數據庫引擎和模式,你可能會超過page.id有組。

一個不錯的查詢規劃器會將子查詢示例轉換爲連接,因此兩個查詢的性能應該類似(如果不相同)。儘管如此,您應該使用EXPLAIN來確定一個變體是否比其他變體更優化。

+0

一個更好的想法,我需要的總計數每個頁面的視圖。 – Muggles

+0

我已經添加了一個部分來檢索查看計數。 – cdhowie

+0

工作完美,謝謝! – Muggles

1

爲什麼不用左連接使用一個查詢?

SELECT * FROM pages p LEFT JOIN views v ON p.id = v.page_id 

如果你想要視圖的每個頁面的計數:

SELECT p.*, v.*, COUNT(v.page_id) as views_count 
FROM pages p LEFT JOIN views v ON p.id = v.page_id 
GROUP BY p.id 
+0

我需要每個頁面的視圖總數。 – Muggles