【发布时间】:2011-02-14 21:30:13
【问题描述】:
当我运行以下代码时:
<cfquery name="someQuery" result="queryResult" datasource="wetakepictures">
SELECT id
FROM events
WHERE category_id = <cfqueryparam value="1" cfsqltype="cf_sql_integer">
OR title like <cfqueryparam value="%test%" cfsqltype="cf_sql_varchar">
</cfquery>
<cfoutput>
#queryResult.sql# <br />
#ArrayToList(queryResult.sqlparameters)#
</cfoutput>
它输出:
SELECT id FROM events WHERE category_id = ? OR title like ?
1,%test%
我需要实际的字符串“SELECT id FROM events WHERE category_id = 1 OR title like '%test%'”。
有没有办法将参数重新绑定到sql?
----编辑----
这样做的原因是为了在对结果进行分页时消除重复的 SQL。我想做这样的事情:
<cftransaction>
<cfquery name='getCount' result='queryResult'>
SELECT count(*)
... conditions that are guarded by <cfif> ...
</cfquery>
<cfquery name='getLimitedRecords'>
#replace(queryResult.sql, 'count(*)', 'id')#
LIMIT ... based on pagination ...
</cfquery>
</cftransaction>
注意:我查看了这个question 并决定对 MySQL 使用两个查询。
【问题讨论】:
-
您究竟为什么需要这样做?听起来您想做一些不可能的事情,但如果您心中有一个目标,我们或许可以帮助您实现该目标,而无需执行此步骤...
-
我想我明白你为什么要这样做,因为我曾经想过这个。实际上不是分页的好方法,因为已经有其他更好的解决方案。如果您总是需要 count(id),则根据这些记录的更改频率将其缓存几分钟。当用户来回移动时,第二个查询也可以被缓存。恕我直言,限制+偏移+如果其他参数的序列在所有可能的情况下都应该很好。如果没有,你可以放简短的描述。你想要达到的目标。
-
我也不明白 cftransaction 是干什么用的。
-
我现在想起了为什么我想这样做一次。在历史记录中保存上次搜索。但几秒钟后,我意识到我只需要参数,而不是整个查询!现在你必须告诉我们你想做什么,因为它太有趣了:)
标签: sql coldfusion