2013-07-24 56 views
0

由於我不知道速度和PHP和MySQL的複雜事情(我)腳本,我有這樣一個問題:分頁:2查詢(行計數和數據)或1個大的查詢

我有一個數據庫有3個表格:

  • '產品'有大約9個字段。包含產品數據,如「長」內容文本。
  • '分類'有2個字段。包含類別名稱
  • 'Productcategories'帶有2個字段。包含哪些產品具有哪些類別。每個產品都是1-3類別的一部分。

爲了建立分頁(我需要ROW_COUNT,因爲我想知道最後一頁是什麼),我不知道該怎麼做了最充分的事情是這樣的,而且也依賴於產品的量(50,100,500)。返回的結果取決於所選擇的類別:

"SELECT * FROM `productcategories` 
JOIN products ON products.proID = productcategories.proID 
WHERE productcategories.catID =$category"; 

理念1:

  • 1查詢只選用1個字段中,而不是所有。然後用mysqli_num_rows()計算我的分頁的總行數。
  • 第二個查詢,它直接選擇5或10(有我期望的極限)產品實際顯示。

理念2:

  • 只有1查詢(上圖),在您使用mysqli_nuw_rows()的行數,後來,篩選出要顯示的行。

我不知道哪個是最好的。想法1似乎更快,因爲您必須選擇一個少得多的數據,但我不知道或需要2個查詢影響速度很多?哪一個最快:收集「大量」數據還是查詢? 如果我與我的想法完全錯誤,請隨時糾正我。

+0

我也不會有太大的差別,但在這兩種情況下,你可能想改變SELECT *只選擇那些你真正需要你的頁面上的字段。 – Maximus2012

+1

'SQL_CALC_FOUND_ROWS'看起來,答案 – 2013-07-24 20:58:27

+0

@ Dagon:這確實看起來是最好的解決方案! – Pepe

回答

2

通常認爲最好的做法是返回儘可能少的數據,因此簡短的答案是使用兩個查詢。 儘管如此,MySQL不會提供一個有趣的功能,讓你回到那個本來沒有限制子句返回的行數:

FOUND_ROWS()

請記住不是所有的數據庫管理系統實現這一點,所以在使用小心。

例子:

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name 
    -> WHERE id > 100 LIMIT 10; 
mysql> SELECT FOUND_ROWS(); 
+0

但這需要SQL_CALC_FOUND_ROWS,對不對?它是否也適用於mysqli? – Pepe

+0

沒錯。就我所知,這是MySQL的特定情況,可能會損害數據庫的可移植性,但如果您只打算使用mysql,則會非常有用。這是mysql本身的一個功能,所以無論你用什麼適配器連接到mysql服務器,它都能工作。 –

+0

http://stackoverflow.com/questions/186588/which-is-fastest-select-sql-calc-found-rows-from-table-or-select-count – Pitchinnate

0

對於總行數使用select count(1) as count...。然後根據需要使用limit 0,10或類似的東西分頁選擇數據。

同樣爲總數你不需要加入到productscategories表,因爲這隻會用於顯示額外的信息。

"SELECT count(1) as count FROM `productcategories` WHERE catID=$category"; 

然後數據:

"SELECT * FROM `productcategories` 
JOIN categories ON categories.catID = productcategories.catID 
JOIN products ON products.proID = productcategories.proID 
WHERE productcategories.catID=$category limit 0,10"; 

更換*有會更好,但實際需要的領域。

+0

我需要他們所有在那裏 – Pepe