【问题标题】:Tricky query solution棘手的查询解决方案
【发布时间】:2009-10-23 10:23:19
【问题描述】:

有没有人知道如何创建一个产品过滤查询(或多个查询)来模拟此页面上的结果?

http://www.emag.ro/notebook_laptop

说明

如果您按 HP 作为品牌,该页面将向您显示所有 HP 产品,其余可用过滤器均从此查询结果中收集。到现在为止很好,花花公子,我得到了这个舔,没有任何问题。

按 4GB 内存,您当然会看到所有具有此属性/功能的 HP 产品。又一次很好,花花公子,直到这里没有问题。

但是,如果您仔细观察,您会发现品牌功能现在也显示出来了,比如说 Acer,有一些具有 4GB 功能的产品,可能在 Acer 之后还有更多产品,并且该复选框还没有被按下。

想到的唯一想法是对数据库进行更多查询以获得这些其他可能性结果。

在您开始检查第三个可能的选项(比如说显示尺寸)之后,事情开始变得更加复杂。

我想我的问题是: 有没有人知道如何通过大量查询对服务器进行征税?

非常感谢你读到这里,我希望我在这个小故事中清楚地表达了自己。

【问题讨论】:

    标签: php sql mysql


    【解决方案1】:

    看一下sql

    UNION
    

    语法。

    "UNION 用于将多个 SELECT 语句的结果组合成一个结果集。"

    【讨论】:

    • 感谢您的想法 :) 从未使用过 UNION,但它看起来在某些情况下可能会有所帮助!
    【解决方案2】:

    这并不是真正的“大量”查询,而是每个属性类型(品牌、RAM、HDD)的一个查询。假设您选择了 HP、4GB RAM 和 250GB 磁盘。现在为每个属性类型根据过滤器选择产品,except 为当前类型,并按当前类型按结果分组。在一个简单的模型中,查询可能如下所示:

    SELECT brand, count(*) FROM products WHERE ram='4BG' AND disk='250GB' GROUP BY brand
    SELECT ram, count(*) FROM products WHERE brand='HP' AND disk='250GB' GROUP BY ram
    SELECT disk, count(*) FROM products WHERE brand='HP' AND ram='4BG' GROUP BY disk
    SELECT cpu, count(*) FROM products WHERE brand='HP' AND ram='4BG' AND disk='250BG' GROUP BY cpu
    ...
    

    您应该在列上有索引,这样每个查询都不会对表进行顺序扫描。当然有一些“流行”的组合,当用户对列表进行排序/导航时,您可能必须在多个页面上显示相同的数字,因此您可能希望缓存数字并在更新/插入/删除时使缓存无效.

    【讨论】:

    • 我认为这可能有效......我会尝试并返回结果 :) 非常感谢!
    • 使用 COUNT(1) 代替 COUNT(*)。它更快,因为它不必遍历所有列并查看它们是否为 NULL。
    • @Felix:这是不正确的,count(*)count(1) 完全相同 - 它计算行数。仅当您使用 count(column) 时,它才会检查它们是否为 NULL
    • 成功了!没有太多时间来开发它,我设法在周末完成了它,但主要的想法是它是完美的!谢谢卢卡斯!! technica.cytest.info/cyprus/laptop-computers 看看它的实际应用......
    • 没问题,很高兴它对你有用。现在您的网站上有一些损坏的非笔记本电脑页面,但我想您已经知道了。 :)
    【解决方案3】:

    可能有一些复杂的方法可以确定结果与您的条件之间的一些计算距离,但它可能就像在查询中使用 OR 而不是 AND 一样简单。

    【讨论】:

    • 对不起,忘了说我在同一组的过滤器之间使用了 OR,以及在组之间使用了 AND。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 2013-08-01
    • 1970-01-01
    • 2013-03-22
    • 2015-11-22
    • 1970-01-01
    相关资源
    最近更新 更多