2014-09-27 49 views
0

我有一组消息,其中一些消息来自名为“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#返回的所有用户ID,删除是他们在#messageData#的消息,并把它们在#messageData#顶部,这样我可以输出结果。这是一个QoQ还是有更好的方法?

我不能真正把我的头围绕QQ,但我正在刺探它。有没有更好的方法,然后做三个不同的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

你真的不应该把你的解决方案放在你的问题上,而是放在一个单独的答案中。 – 2014-09-29 18:18:58

回答

2

我看不到有这样做,而不使用环比更快捷的方式,没有。这是有点什么:这些特殊情况下,应用程序需要来自数据库的原始数据,以及它的变体。

+0

感谢您的建议。我添加了工作的QoQs,但是想知道是否有更好的方法比做三... – user1431633 2014-09-28 00:00:56

+0

是的,你可以在一个这样做。像现在一样,将前两个查询与'UNION'结合起来;但是在每个查询中添加一个新列,它给你在* UpvotesNum DESC,发布DESC之前排序的内容*,以使两个子集保持正确的顺序(即:添加'1 AS sortCol'到第一个查询的'SELECT';'2 AS sortCol'到第二个,然后'ORDER BY sortCol,UpvotesNum DESC,posted DESC' – 2014-09-28 01:14:27

+0

对主要问题增加了答案,谢谢! – user1431633 2014-09-28 01:39:23

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,但只有一个查询来获得管理列表,这个直接查询到数据库可能工作。

(以前,我不能肯定,如果你能在环比使用情况。你不能,因此,如果这在所有工作,那就要直接查询数据库。)