将行移动到查询的开头

时间:2014-09-27 22:43:34

标签: coldfusion coldfusion-10

我有一个记录集的消息,其中一些来自名为" 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>

2 个答案:

答案 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。你不能这样做,所以如果这完全有效,就必须直接查询数据库。)