0

我的 PHP 应用程序具有product_fetch([parameters])返回“产品”对象的功能,这些对象的信息存储在数据库中。

在我的管理区域中,有一个名为“特色产品”的页面,它允许我选择 10 种产品在主页中显示。

现在问题来了:我做了 10 个选择/组合框,每个都允许我从 400 个产品中选择一个产品。因此,为了做出所有选项,必须进行查询:SELECT * FROM products

问题:即使有数百行,进行这样的查询是否正确?

4

4 回答 4

2

您提出的解决方案当然是可行的,与 MySQL 能够处理的上限相比,400 行确实很温和。更令人担忧的是这里的用户体验。当然这只会影响你,但我会为自己设计一些比一堆<select>s 更好的东西。我的想法是从一个自动完成产品名称的文本框开始。如果产品标题具有全文索引,则可以做到这一点。然后你的自动完成脚本可以使用这个查询:

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

有很多 jQuery 插件,比如 Autocomplete可以处理 JS 端(查询服务器以获取自动完成结果)。我刚刚提到的那个添加了一个termGET 参数,您可以轻松地抓取并放入查询中:

// 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.

于 2012-08-31T04:38:53.737 回答
1

您最好在查询中指定想要的产品,并且仅在您根本不打算使用任何其他产品时才返回这些产品。

您可以使用多种方法来做到这一点。一个简单的方法是在这样的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 使用更多处理信息的资源。

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

上面的查询将从偏移量中选择 10 个条目$page 获取所有行是一个坏主意,因为无论如何您只使用 10 个。当您的表扩展到数百万行时,您会看到明显的差异。

于 2012-08-31T04:00:08.803 回答
1

如果这是您的意思,那么选择所有行从根本上没有错。就性能而言,数百行也不应该成为查询的问题。但是,如果您的数据库增长到那么大,可能会有数千或数百万。

想想用户——他们可以滚动浏览数百种产品吗?大概。如果不是,那么可能是 UI 设计有问题,而不是查询。

于 2012-08-31T04:03:24.727 回答