【问题标题】:how to select a specific record from a query in Coldfusion?如何从 Coldfusion 中的查询中选择特定记录?
【发布时间】:2012-07-13 07:32:54
【问题描述】:

我正在尝试使用 Coldfusion8/MySQL 优化产品搜索以在移动设备上使用。

现在发生以下情况:

1. user searches for "FOO"
2. Q1: search database for no of results
3. Q2: search again to get actual data for results FROM TO depending on pagination
4. user clicks details for a product
5. redo Q1 to get no of results
6. redo Q2 to get single result
7. use single result to query for product details (sizes, colors, pricings...)

我正在寻找一种跳过重做 Q1 和 Q2 的方法,因为用户从结果集中选择了一个结果,那么我为什么要再次重建结果集以获得一个结果。

问题
我想方法是传递一个变量,表明我只需要现有查询中记录的详细信息。假设我有结果 1-20,并且我传递了一个变量“DETAIL”和一个文章编号“123”,我将如何从现有结果集中选择匹配记录 = 如何从结果集中选择特定记录?uery

编辑: 所以我认为我的情况的唯一方法是第一次运行查询,将结果存储在 Session.storage 中,然后从存储中选择相应的记录,而不是重新运行我的初始搜索。

Query of Queries 不起作用,因为我的初始查询在 cfinvoke 方法内,所以当它完成后,它就消失了,在下一次通过时,我无法查询最后一个 cfinvoke 的结果。

我还尝试将存储到我的 cfc 变量范围。也不起作用,我想也是出于同样的原因。我不想开始使用 cfobject,因为我仍在运行 CF8,而且我正在阅读很多关于 cfobject 如何影响性能的文章。

无论如何。在我的第一个名为“结果”的查询中,我现在正在存储

<cfset Session.storate = results>

当我转储会话存储时,我得到:

catch - query
    CACHED: false 
    EXECUTIONTIME: 2031 
    SQL: SELECT a.*, p.ek, p.vk, p.x, p.y
        FROM arts a
    LEFT JOIN p ON 
            ...
            LEFT JOIN f ON 
            ... 
            WHERE a.aktiv = "ja"
            AND 
            ... 20 conditions ...

    SQLPARAMETERS: [array]
    1) %402% 
    ... 20 parameters

    RESULTSET: 
     [Record # 1] 
        a: true
        style: 402
        price: 2.3
        currency: CHF
        ...
     [Record # 2] 
        a: true
        style: 402abc
        ...

我现在的问题是:

如何循环 session.storage 并检查样式?如果找到,这是我的结果,我将从中构建详细视图。

【问题讨论】:

    标签: select coldfusion resultset


    【解决方案1】:

    我不确定我是否关注,但如果我关注,您可以执行查询查询,它允许您查询在您的页面上运行的现有查询。

    <cfquery name="getOneRecord" dbtype="query">
    SELECT record
    FROM originalqueryname
    WHERE articlenumber = 123
    </cfquery>
    

    如果您只需要检索一个结果,这可能是最快的方法。

    【讨论】:

    • 但假设用户搜索 FOO 和 query="getAllRecords" 以显示 1-20 的结果。当用户现在想查看记录 17 的详细信息时,我不想再次查询,而是使用“getAllRecords”结果集中的第 17 条记录。我是否只需要遍历 getAllRecords 并检查 articlenumber = 123。如果是,如果不是,则继续,什么都不做?
    • 我问是因为我的查询很长,而且我已经在结果集中有记录 17,为什么我应该重新运行查询以获取 id 为 123 的记录
    • 上面运行的查询是查询的查询,这意味着它不会再次访问您的数据库它正在查询已经存在的查询
    • 如果您只想显示记录,您可以这样做#getAllRecords[columnname][17]#,其中 17 代表列中的当前行。
    • 好的。不知道那个。如果我在 CFC 中执行此操作,原始查询是否仍然可用,我正在 cfinvoke-ing 我的结果处理程序。可能不会……
    【解决方案2】:

    我不确定我是否理解您为什么要重做搜索以获得一条记录。如果用户单击详细信息链接,该链接应该有一些标识符返回到所选项目。然后,我将使用该 ID 来查询数据库并获取产品详细信息。原始搜索查询应该只将相关数据返回到结果显示中。

    【讨论】:

    • 嗯。我仍然坐在上面...所以你有我的耳朵。让我试试。
    • 好的。我只提取第一个查询的基本信息,通过 MySQL(很多左连接)和很多条件真的很痛苦。我想避免一遍又一遍地运行这个查询,所以我的想法是,如果我第一次运行它,为什么我不能存储结果集(Session.storage = queryName),然后从中提取详细基本记录而不是重新运行查询本身。我需要这样做,因为实际的查询在 cfinvoke 中,所以当它完成时,它就消失了。我现在想知道如何遍历结果集...查看我的编辑
    • 这可能很痛苦,但您正在提取不需要的数据。假设您的查询返回 20 列详细信息。您的搜索结果屏幕使用 5 列,详细信息屏幕使用其余列。现在让我们还规定其中一列是包含大量数据的文本列。例如,查询返回 1000 个项目。您现在有大量未使用的数据。所有这些额外的数据加起来。导致额外的查询时间、额外的处理时间、额外的内存使用。这通常只是一种非常低效的处理方式。
    • 我知道这很痛苦... :-) 数据库以 ean/barcode 为基础存储文章,因此记录看起来像 article、ean、info1、info2、info3。因此,一篇文章可能有任意数量的 eans(尺寸、颜色、其他标准)。第一个查询我只提取基本的文章信息(文章、描述......)并显示它。当用户点击“详细信息”时,我需要提取所有文章 eans 来创建订单。所以我的想法是,如果我有 20 个结果(文章),我会存储这些,直到用户进行新的搜索。这样,当他点击“详细信息”时,我可以根据存储的记录之一选择 eans 与重新查询
    【解决方案3】:

    要考虑的另一件事是cachedwithin 属性。

    【讨论】:

    • 如果你可以在 Session 范围内缓存一个查询是的,但是当用户 A 搜索 FOO 并且结果被缓存时,用户 B 在搜索 BAR 并且没有得到任何结果时会碰壁。
    • 如果您首先使用 cachedwithin 属性执行第 3 点(您称为 Q2 的那个),那么当同一个用户执行所有其他查询时,它们会被缓存。
    猜你喜欢
    • 2021-05-16
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    相关资源
    最近更新 更多