我有一个记录集的消息,其中一些来自名为" ADMIN"的组。我想要来自" ADMINS"的所有消息。放在查询对象的顶部,但我无法在原始查询中对它们进行重新排序 - 我必须在已经拥有查询对象后执行此操作。我有办法看到哪些行来自" ADMINS"但是我不确定从查询对象中提取它们并将它们放在顶部的最佳方法。
<!--- this is the query object of all the messages --->
<cfset messageData = application.message.getMessages(inboxID)>
<!--- this returns a list of which users inside the recordset are ADMINS --->
<cfset getAdmins = application.message.getAdmins(valueList(messageData.useridfk)) />
现在我想获取#getAdmins#中返回的所有UserID,删除#messageData#中的消息,并将它们放在#messageData#的顶部,这样我就可以输出结果了。这是一个QoQ还是有更好的方法?
我无法真正了解QoQ,但我正在努力。那么有更好的方法可以做三种不同的QoQ吗?
<!--- this gets all the rows from Admins --->
<cfquery name="getAdminAnswers" dbtype="query">
SELECT *
FROM messageData
WHERE useridfk in ('#getAdmins.id#')
ORDER BY UpvotesNum DESC, posted DESC
</cfquery>
<!--- this gets all the rows from non-RDs --->
<cfquery name="getNonAdminAnswers" dbtype="query">
SELECT *
FROM messageData
WHERE useridfk NOT IN ('#getAdmins.id#')
ORDER BY UpvotesNum DESC, posted DESC
</cfquery>
<!--- join the queries with a UNION in a QoQ --->
<cfquery dbtype="query" name="data">
SELECT * FROM getAdminAnswers
UNION
SELECT * FROM getNonAdminAnswers
</cfquery>
答案:
得到它:像这样:
<!--- this combines two queries into one --->
<cfquery name="data" dbtype="query">
SELECT *, 1 sortCol
FROM messageData
WHERE useridfk in ('#variables.getAdmins.id#')
UNION
SELECT *, 2 sortCol
FROM messageData
WHERE useridfk NOT IN ('#variables.getAdmins.id#')
ORDER BY sortCol, UpvotesNum DESC, posted DESC
</cfquery>
答案 0 :(得分:2)
我无法看到没有使用QoQ的更方便的方法,没有。这就是它的用途:这些特殊情况下,应用程序既需要来自数据库的原始数据,也需要它的变体。
答案 1 :(得分:1)
你能说
吗?SELECT *,
(CASE WHEN USERIDFK IN ('#getadmins.id#') THEN 1 ELSE 0 END) as mRank
FROM MessagesTableName
ORDER BY mRank DESC, UpvotesNum DESC, posted DESC
无论如何,那将是SQL Server语法,我不确定你使用的SQL风格。
我意识到所有三个查询都是QoQ,但只有一个查询来获取管理员列表,这个对数据库的直接查询可能会有效。
(以前,我不确定你是否可以在QoQ中使用CASE。你不能这样做,所以如果这完全有效,就必须直接查询数据库。)