我目前正面临着我的while循环问题。这是场景,我需要分别在金字塔的左侧和右侧产生总人数。所以,这是我的代码:
[u'a', u'b', u'c']
我现在的问题是金字塔下的推荐计数只到达第3级的特定级别/层。它不计算级别4下的推荐,依此类推。
我的循环有什么问题?我应该将while循环转换为“for”循环吗?因为我不知道怎么做而不搞乱代码。
注意:这是针对金字塔推介投影,所有评论和建议都表示赞赏。
答案 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现在需要更新所有间接引用,以便路径保持最新。