2012-08-31 19 views
0

我的PHP應用程序具有功能product_fetch([parameters]),它返回信息存儲在數據庫中的「產品」對象。PHP/MySQL:替代選擇所有產品/行?

在我的管理區域中,有一個名爲「精選產品」的頁面,可以讓我選擇10個產品顯示在主頁面中。

現在問題來了:我做了10選擇/組合框,每一個可以讓我選擇一個產品,淘汰400所以爲了使所有的選項,查詢要作出:SELECT * FROM products

問題:即使有數百行,做出這樣的查詢是否正確?

+0

同意lc也是OP,而不是有10個select/comboboxes有400多條記錄供他選擇,不是最好給出一個帶有複選框的分頁列表,以便用戶可以檢查他想要在主頁上顯示的內容? – raidenace

回答

1

你會更好地指定其中你想要在查詢中的產品,只有當你沒有打算使用任何其他人的意圖時才返回這些產品。

你可以用很多方法做到這一點。一個簡單的人會使用的in聲明這樣一個ID字段:

select col1, col2 from products where id in(1,4,12,5) 

這似乎使差別不大,但如果你的查詢產品表,它有一個十萬行?

你也可以有一個標誌,在表中說,項目是功能這將讓你使用這樣的:

select col1, col2 from products where featured='Y' 

或者你甚至可以有,只有有特色的項目表(甚至只是他們的ID),並將其加入到你的主要上市這樣的:

select 
    a.col1, 
    a.col2 
from 
    products a 
     join featured b 
      on a.id=b.id 

如果你想通過你的整個表來挑去,你甚至可以用一個簡單的limit條款拾取一定數量的從錶行,並且可以重複使用,以獲得下一組:

select col1, col2 from products limit 10; 
// Will pick the first 10 rows of data. 

select col1, col2 from procuts limit 30,10; 
// Will pick rows 31-40 (skipping first 30, then returning next 10) 

簡短的版本是,雖然,不管你怎麼做,拉回數據的整個表內PHP通過它來挑是不好的事情,不惜一切代價避免。它使數據庫工作變得更加困難,在數據庫和PHP之間使用了更多的網絡(即使它們在同一臺機器上,它們在兩者之間傳輸更多數據),並且默認情況下PHP會使用更多資源來處理信息。

+0

我讀它的方式,OP有使用所有行的意圖。 (你的查詢對於首頁是好的,是的,但這不是OP要求的...) –

1
SELECT * FROM tbl LIMIT $page,10; 

上面的查詢將選擇從偏移$page 抓取所有行是一個糟糕的主意,因爲你正在使用10只反正10個條目。當你的表擴展到數百萬行時,你會看到明顯的差異。

+0

我讀它的方式是,OP不使用10,它們全部使用它們。 –

+0

他一次只用10個,是我從問題中收集到的。 –

+0

嗯,我讀到他在使用它們,所以用戶可以從列表中選擇10個。 (好吧,至少選擇10次。) –

1

選擇所有行沒有什麼根本性的錯誤,如果這就是你的意思。在性能方面,數百行也不應該成爲查詢的問題。然而,如果你的數據庫增長很大,可能會有成千上萬的人。

想想用戶 - 他們可以滾動瀏覽數百種產品嗎?大概。如果沒有,那麼也許它是故障的UI設計,而不是查詢。

2

你提出的解決方案肯定是可行的,與MySQL能夠處理的上限相比,400行真的很溫順。更值得關注的是這裏的用戶體驗。當然,這隻會影響你,但我會設計一些比一堆<select>更好的東西。我的想法是從一個自動完成產品名稱的文本框開始。這可以通過product title has a fulltext index來完成。然後您自動完成的腳本可以使用此查詢:

SELECT * FROM Products WHERE MATCH(title) AGAINST ('contents of textbox' IN BOOLEAN MODE); 

有很多jQuery插件like Autocomplete將處理JS側(查詢自動完成結果的服務器)的。我剛纔提到的增加了一個term GET參數,你可以很容易地抓住並扔進查詢:

// You might want to only select the relevant columns 
$stmt = $pdo->prepare('SELECT * FROM Products WHERE MATCH(title) AGAINST (:search IN BOOLEAN MODE)'); 
$stmt->execute(array(':search' => $_GET['term']); 

// Output JSON results 
echo json_encode($stmt->fetchall()); 

一旦你輸入(或單擊自動完成結果)在一個文本框,另外一個應該出現在其下方重點應該放在它上面。從那裏你可以輸入另一個產品,並繼續下去,直到你達到10個。每個文本框(除非只有一個)應該在它旁邊有一個刪除鏈接,將該產品從精選列表中刪除。

我會尋找一個網站,實現這種功能,所以你可以更好地理解我在說什麼。基本上在這裏,你正在尋找的是實現。你不需要有10個選擇框和400個選項,你不需要SELECT * FROM Products

+0

從來沒有讀過關於MySQL中的match/against命令。會做一些研究。至於JQuery UI的自動完成插件,我以前用過它,不是一個壞主意。但由於這不是一個如此複雜的應用程序,所以我不會在用戶界面上打擾太多,所以我會堅持使用'select'方法,感謝bud – user1091856

+0

+詳細解釋 – Baba