2008-09-28 59 views
3

我有一個「items」表和一個「itemkeywords」表。 當用戶搜索關鍵字時,我想給他一頁結果加上結果總數。在表格中搜索並獲得結果和結果數量的最佳方法(MySQL)

我在做什麼目前是(針對搜索「ABC」用戶:

SELECT DISTINCT {fields I want} FROM itemkeywords JOIN items 
    WHERE (keyword = 'a' or keyword='b' or keyword='c' 
    ORDER BY "my magic criteria" 
    LIMIT 20.10 

,然後我做同樣的查詢與計數

SELECT COUNT(*) FROM itemkeywords JOIN items 
    WHERE (keyword = 'a' or keyword='b' or keyword='c' 

這可能會得到一個相當大的桌子,我認爲這個解決方案非常吸...
但我想不出什麼好多了

明顯的替代避免打MySQL兩次,這是隻做第一個查詢,沒有LIMIT子句,然後導航到正確的記錄顯示相應的頁面,然後到記錄集的結尾,以計算結果似乎更糟糕...

任何想法?

注:我使用ASP.Net和MySQL,PHP不

+0

在過去的應用程序中,我使用了兩種技術(兩個查詢和一個沒有限制子句的查詢),具體取決於我期待的結果數量。我認爲有一個想法(雖然我從來沒有嘗試過)正在加入一個幾乎相同的子查詢來計算。這將是1分貝命中,但仍然有IO。 – 2008-09-28 16:40:22

回答

5

後選擇添加SQL_CALC_FOUND_ROWS在你有限的選擇,然後做一個 「SELECT FOUND_ROWS()」 之後的第一選擇完成。

例子:

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

你有2種選擇:

MySQL的API應該有一個返回的行數的函數。使用舊的API它的mysql_num_rows()。如果您使用未緩衝的查詢,這將不起作用。

的更簡單的方法可能是到這兩個查詢組合:

SELECT DISTINCT {fields I want}, count(*) as results 
     FROM itemkeywords JOIN items 
     WHERE (keyword = 'a' or keyword='b' or keyword='c' 
     ORDER BY "my magic criteria" 
     LIMIT 20.10 

我做了一些測試,和COUNT(*)的功能不會受到限制條款。我會首先用DESCRIBE進行測試。我不知道它會影響你的查詢速度。只有前10個結果的查詢應該短於那個必須查找所有計數結果,然後是前10個的查詢,但我可能在這裏是錯誤的。

1

如果您真的擔心性能,並且最終需要進行兩個查詢,則可能需要考慮緩存匹配的總數,因爲用戶瀏覽結果頁面時不會發生更改。