推荐计数生成不计入所有推荐(循环难度)

时间:2015-07-27 02:34:04

标签: c# asp.net

我目前正面临着我的while循环问题。这是场景,我需要分别在金字塔的左侧和右侧产生总人数。所以,这是我的代码:

[u'a', u'b', u'c']

我现在的问题是金字塔下的推荐计数只到达第3级的特定级别/层。它不计算级别4下的推荐,依此类推。

我的循环有什么问题?我应该将while循环转换为“for”循环吗?因为我不知道怎么做而不搞乱代码。

注意:这是针对金字塔推介投影,所有评论和建议都表示赞赏。

1 个答案:

答案 0 :(得分:2)

您可以尝试以下方法之一。不用说,无论如何,你需要AssignedTo列的索引。

(1)使用递归函数计算间接引用直到任何深度。不过,我会谨慎使用它,因为太多的嵌套调用确实会使数据库出现瓶颈。

int CountReferrers(string accountID, string position = null)
{
  int count = 0;

  // If a position argument was specified, add the filter to the query
  string cmdText = "SELECT * FROM Accounts WHERE AssignedTo=@Referrer";
  if (position != null)
    cmdText += " AND PyramidPosition=@Position";

  var cmd = new SqlCommand(cmdText, this.Connection);
  cmd.Parameters.AddWithValue("@Referrer", accountID);

  // If a position argument was specified, add the value to the parameter
  if (position != null)
    cmd.Parameters.AddWithValue("@Position", position);

  // Count the child referrers, without specifying position
  using (SqlDataReader reader = cmd.ExecuteReader())
  {
    while (reader.Read())
      count += CountReferrers(reader["AccountID"].ToString());
  }

  return count;
}

void Main()
{
  string userId = Session["UserID"].ToString();
  int referrerCount = CountReferrers(userId, "Left");
  Console.Write(referrerCount);
}

(2)编写一个更好的SQL查询,使用JOIN将所有内容展平为单个命令。您可以添加任意数量的连接,例如最多8个,如果此级别没有引用,则AccountID8列将为NULL。

SELECT
    a1.AccountID AS AccountID1,
    a2.AccountID AS AccountID2,
    a3.AccountID AS AccountID3
FROM
    Accounts AS a1
    LEFT OUTER JOIN Accounts AS a2 ON a2.AssignedTo = a1.AccountID
    LEFT OUTER JOIN Accounts AS a3 ON a3.AssignedTo = a2.AccountID
WHERE
    a1.AssignedTo=@Referrer AND PyramidPosition=@Position

(3)设计数据库以支持树检索。例如,添加一个引用者路径列,如下所示(字符串):

AccountID        Referrer        ReferrerPath
1                NULL            NULL
2                1               /1/
3                2               /1/2/
4                3               /1/2/3/
5                2               /1/2/

然后检索间接孩子变得更加简单:

SELECT * FROM Accounts WHERE ReferrerPath LIKE '/1/%';

为您提供直接或间接引用帐户ID 1的所有行。当然,更改referrer现在需要更新所有间接引用,以便路径保持最新。