我有一张答案表(tbAnswers)。我有一个表格可以存储一个答案(tbContentRanking)的表格,每次答案被提出时都有记录。
我正在查询tbAnswers以获得每个问题的答案,我希望最热门的答案(tbContentRanking中的大多数记录)位于顶部。如果tbContentRanking中的recordCount与答案之间存在关联,我希望最近的答案能够赢得平局。
以下是表格:
**tbAnswers**
AnswerID AnswerValue QuestionID CreateDateTime
1 This is an answer 15 Sept. 01 2014
2 This is another answer 15 Sept. 03 2014
3 This is yet another 15 Sept. 09 2014
4 Here's an answer 15 Sept. 10 2014
**tbContentRanking**
ContentRankingID AnswerID QuestionID UserID
1 3 15 10
2 3 15 101
3 2 15 30
4 2 15 3
5 4 15 23
6 4 15 42
7 4 15 4
8 1 15 6
基于此,它会对结果进行排序:
AnswerID:
4, 3, 2, 1
(3和2并列,但3更近)
最初的tbAnswers查询(qGetAnswers)非常复杂(出于其他商业原因)所以我只想查询getAnswers的查询,但不知道如何执行此操作。或者,如果查询查询不是最好的主意,我会向其他人开放。
查询查询:
<cfquery name="getAnswersOrder" dbtype="query">
SELECT *
FROM qGetAnswers
(SELECT Count(AnswerID) AS theCount
FROM tbContentRanking
WHERE QuestionID = #arguments.questionID#)
Order By theCount, CreateDateTime
</cfquery>
这是类似的事情,但很遗憾如何构建查询查询。或者就像我说的,也许QoQ甚至不是最好的选择。
答案 0 :(得分:2)
您想使用GROUP BY子句:
SELECT QuestionID, CreateDateTime, Count(AnswerID) as theCount
FROM tbContentRanking
WHERE QuestionID = #arguments.questionID#
GROUP BY QuestionID, CreateDateTime
ORDER BY Count(AnswerID), CreateDateTime
答案 1 :(得分:1)
另一个解决方案是下一个:
而不是计算数量。通过添加名为tbAnswers
的列,您可以denormalize UpvotesNum
表使用子查询的upvotes。这意味着每个upvote动作都会“触摸”两行:
tbContentRanking
表中的一行(因为INSERT INTO tbContentRanking (AnswerID, ...) VALUES (@AnswerID, ...)
)和tbAnswers
表中的另一行(因为UPDATE tbAnswers SET UpvotesNum = UpvotesNum + 1 WHERE AnswerID = @AnswerID
。从这个角度来看,用最多的投票来展示这些答案的问题变得微不足道了:
SELECT ... columns ...
FROM tblAnswers
ORDER BY UpvotesNum, CreateDateTime
答案 2 :(得分:1)
您只需在原始查询中使用子查询即可完成您想要执行的操作。这适用于SQL Server,我不了解其他DBMS的
SELECT AnswerValue, QuestionID, CreateDateTime, (SELECT Count(AnswerID)
FROM tbContentRanking WHERE tbContentRanking.QuestionID = tbAnswers.questionid) as theCount
ORDER BY theCount DESC
我理解您的原始查询非常复杂,但您确实需要最小化对DB(或QofQ)的调用,这很容易添加。