0

私のPHPアプリケーションには、product_fetch([parameters])情報がデータベースに保存されている「製品」オブジェクトを返す関数があります。

私の管理エリアには、メイン ページに表示する 10 個の製品を選択できる「注目の製品」というページがあります。

ここで問題が発生します。10 個の select/combobox を作成しました。それぞれで 400 個の製品から 1 つの製品を選択できます。したがって、すべてのオプションを作成するには、クエリを作成する必要があります。SELECT * FROM products

質問: 何百行もあるのに、このようなクエリを作成するのは正しいですか?

4

4 に答える 4

2

あなたが提案した解決策は確かに実行可能であり、MySQL が処理できる上限と比較して、400 行は本当に穏やかです。さらに懸念されるのは、ここでのユーザーエクスペリエンスです。確かに、これはあなたにしか影響しませんが、私はたくさんの<select>s よりも少し良いものを自分で設計します. 私の考えは、製品名をオートコンプリートする 1 つのテキストボックスから始めることです。これは、商品タイトルに全文索引がある場合に実現できます。次に、オートコンプリート スクリプトで次のクエリを使用できます。

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

JS 側を処理する (オートコンプリートの結果をサーバーに照会する)オートコンプリートのようなjQuery プラグインはたくさんあります。先ほど言及したものは、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());

1 つのテキスト ボックスに入力 (またはオートコンプリートの結果をクリック) すると、その下に別のテキスト ボックスが表示され、フォーカスがそれに移動します。そこから別の製品を入力し、10 に到達するまで続けます。各テキスト ボックス (1 つしかない場合) の横には、その製品を注目のリストから削除する削除リンクが必要です。

この種の機能を実装しているサイトを探して、私が話していることをよりよく理解できるようにします. 基本的にここで、探しているものが達成されます。400 個のオプションがある 10 個の選択ボックスを持つ必要はなく、 SELECT * FROM Products.

于 2012-08-31T04:38:53.737 に答える
1

すべての行を選択することを意図している場合、基本的に問題はありません。パフォーマンスの観点から、数百行もクエリの問題にはなりません。ただし、データベースがそれほど大きくなると、数千または数百万になる可能性があります。

ユーザーのことを考えてみてください。ユーザーは何百もの商品をスクロールできますか? おそらく。そうでない場合は、クエリではなく、UI デザインに問題がある可能性があります。

于 2012-08-31T04:03:24.727 に答える
1

クエリで必要な製品を指定し、他の製品を使用する意図がまったくない場合にのみそれらを返すがはるかに優れています。

これは、多くの方法を使用して行うことができます。in単純なものは、次のようなステートメントで ID フィールドを使用することです。

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

ほとんど違いがないように思えるかもしれませんが、procuts テーブルに 10 万行あるとしたらどうでしょうか。

次のようなものを使用できるようにするアイテムが特集されていることを示すために、テーブルにフラグを設定することもできます。

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 の間でより多くのネットワークが使用され (同じマシン上にある場合でも、2 つの間でより多くのデータが転送されます)、デフォルトで PHP がより多くのデータを使用するようになります。情報を処理するためのリソース。

于 2012-08-31T03:59:29.030 に答える
1
SELECT * FROM tbl LIMIT $page,10; 

上記のクエリは、オフセットから 10 個のエントリを選択します$page 。とにかく 10 個しか使用していないため、すべての行をフェッチすることはお勧めできません。テーブルが数百万行に拡張されると、顕著な違いが見られます。

于 2012-08-31T04:00:08.803 に答える