簡體   English   中英

PHP / MySQL:選擇所有產品/行的替代方法?

[英]Php/MySQL: Alternative for selecting all products/rows?

我的PHP應用程序具有函數product_fetch([parameters]) ,該函數返回“ Product”對象,這些對象的信息存儲在數據庫中。

在我的管理區域中,有一個名為“特色產品”的頁面,該頁面使我可以選擇10個要在主頁上顯示的產品。

現在出現了問題:我做了10個select / combobox,每個都允許我從400個中選擇一個產品。因此,要進行所有選擇,必須進行查詢: SELECT * FROM products

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

您提出的解決方案當然是可行的,並且與MySQL能夠處理的上限相比,實際上只有400行是溫柔的。 更重要的是這里的用戶體驗。 當然,這只會影響您,但我會設計自己一些比一堆<select>更好的東西。 我的想法是從一個文本框開始,該文本框會自動完成您產品的名稱。 如果產品標題具有全文索引,則可以完成此操作。 然后,您的自動完成腳本可以使用以下查詢:

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

有很多jQuery插件( 例如自動完成功能)可以處理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

如果在查詢中根本不打算使用其他任何產品,則最好指定在查詢中需要哪些產品,然后僅返回這些產品。

您可以使用多種方法來執行此操作。 一種簡單的方法是在in語句中使用ID字段,如下所示:

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

這似乎沒有什么區別,但是如果您的procuts表中有十萬行呢?

您還可以在表中有一個標志來說明這些項目具有特色 ,這樣您就可以使用以下內容:

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使用更多的數據庫處理信息的資源。

SELECT * FROM tbl LIMIT $page,10; 

上面的查詢將從offset $page選擇10個條目獲取所有行是一個壞主意,因為無論如何您僅使用10個。 當表擴展到數百萬行時,您會看到明顯的不同。

如果您要這樣做,那么選擇所有行根本沒有錯。 就性能而言,數百行也不應該成為查詢的問題。 但是,如果數據庫如此之大,則可能成千上萬。

考慮用戶-他們可以滾動瀏覽數百種產品嗎? 大概。 如果不是,那么可能是UI設計有問題 ,而不是查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM