我的PHP应用程序具有函数product_fetch([parameters])
,它返回'Product'对象,这些对象的信息存储在数据库中。
在我的管理区域,有一个名为“特色产品”的页面,它允许我选择10个产品显示在主页面中。
现在出现问题:我制作了10个select / combobox,每个允许我从400中选择一个产品。因此,为了制作所有选项,必须进行查询:SELECT * FROM products
问题:进行这样的查询是否正确,即使有数百行?
答案 0 :(得分: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
。
答案 1 :(得分: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使用更多处理信息的资源。
答案 2 :(得分:1)
SELECT * FROM tbl LIMIT $page,10;
以上查询将从偏移$page
中选择10个条目
获取所有行是一个坏主意,因为您仍然只使用10。当您的表扩展到数百万行时,您会看到明显的差异。
答案 3 :(得分:1)
选择所有行是没有根本错误的,如果这是你的意思。在性能方面,数百行也不应成为查询的问题。但是,如果您的数据库变得那么大,可能会有数千或数百万。
想想用户 - 他们可以滚动浏览数百种产品吗?大概。如果没有,那么可能它是错误的UI设计,而不是查询。