根据upvotes的数量订购论坛答案

时间:2014-09-27 01:43:47

标签: sql sql-server coldfusion coldfusion-10

我有一张答案表(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甚至不是最好的选择。

3 个答案:

答案 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动作都会“触摸”两行:

  1. tbContentRanking表中的一行(因为INSERT INTO tbContentRanking (AnswerID, ...) VALUES (@AnswerID, ...))和
  2. tbAnswers表中的另一行(因为UPDATE tbAnswers SET UpvotesNum = UpvotesNum + 1 WHERE AnswerID = @AnswerID
  3. 从这个角度来看,用最多的投票来展示这些答案的问题变得微不足道了:

      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)的调用,这很容易添加。