为什么';条件值是否与从MySQL表传递的查询匹配?
我有一个棘手的问题,我似乎也找不到任何解决办法。我已经扫描了这么多相关的问题,以获得灵感,但似乎没有以前的答案,解决我的问题。这个问题是我在一个类似的问题中提出的这些问题的演变——并且。所以我们走吧 我在VB.NET和MySQL中构建了一个投票系统,根据候选人的选票和第二优先选择在候选人之间传输选票(可以找到更多关于如何工作的信息) 我已经到了这样一个地步:如果有任何偏好需要重新分配,那么选票的重新分配就会完美地发挥作用。但是,如果选票上的所有优先候选人都已经被淘汰,那么选票就必须用尽,而这正是程序上变得麻烦的地方。我有一个MySQL查询,在被淘汰候选人的每一张选票上查找下一个可用的偏好(2比剩下的候选人数量)。如果没有保留首选项,查询将返回NULL。为了避免这种情况,我使用COALESCE将NULL替换为0。然后,我尝试使用VB.NET中的If语句根据返回值执行不同的操作(0=用尽的投票,1=被淘汰的候选人,2到x=被淘汰的候选人投票的重新分配)。 出于某种原因(这是我的问题),If语句从不运行(因此永远不会解释0)。无论返回什么值,它都会运行到ELSE 这是MySQL查询。返回值“1”总是被忽略,因为它引用了将要删除的当前候选项:为什么';条件值是否与从MySQL表传递的查询匹配?,mysql,vb.net,Mysql,Vb.net,我有一个棘手的问题,我似乎也找不到任何解决办法。我已经扫描了这么多相关的问题,以获得灵感,但似乎没有以前的答案,解决我的问题。这个问题是我在一个类似的问题中提出的这些问题的演变——并且。所以我们走吧 我在VB.NET和MySQL中构建了一个投票系统,根据候选人的选票和第二优先选择在候选人之间传输选票(可以找到更多关于如何工作的信息) 我已经到了这样一个地步:如果有任何偏好需要重新分配,那么选票的重新分配就会完美地发挥作用。但是,如果选票上的所有优先候选人都已经被淘汰,那么选票就必须用尽,而这正是
SELECT DISTINCT candidate, COALESCE(MIN(preference), 0) preference FROM (
SELECT 'vote_candidate_1' candidate, vote_candidate_1 preference FROM votes WHERE vote_id = '350' UNION
SELECT 'vote_candidate_2' candidate, vote_candidate_2 preference FROM votes WHERE vote_id = '350' UNION
SELECT 'vote_candidate_3' candidate, vote_candidate_3 preference FROM votes WHERE vote_id = '350' UNION
SELECT 'vote_candidate_4' candidate, vote_candidate_4 preference FROM votes WHERE vote_id = '350' UNION
SELECT 'vote_candidate_5' candidate, vote_candidate_5 preference FROM votes WHERE vote_id = '350')
pivot WHERE preference > '1' ORDER BY preference ASC;
在phpMyAdmin中运行此查询将返回我所期望的结果(在此阶段,我只对preference列感兴趣):
我已经使用EXPLAIN检查了union语句,以了解查询中发生了什么。它返回以下内容:
+----+--------------+------------------+-------+---------------+---------+---------+-------+------+----------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | extra |
+----+--------------+------------------+-------+---------------+---------+---------+-------+------+----------------------------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | PRIMARY | NULL | NULL | 5 | Using where; Using temporary |
+----+--------------+------------------+-------+---------------+---------+---------+-------+------+----------------------------------+
| 2 | DERIVED | votes | const | PRIMARY | PRIMARY | 4 | const | 1 | |
+----+--------------+------------------+-------+---------------+---------+---------+-------+------+----------------------------------+
| 3 | UNION | votes | const | PRIMARY | PRIMARY | 4 | const | 1 | |
+----+--------------+------------------+-------+---------------+---------+---------+-------+------+----------------------------------+
| 4 | UNION | votes | const | PRIMARY | PRIMARY | 4 | const | 1 | |
+----+--------------+------------------+-------+---------------+---------+---------+-------+------+----------------------------------+
| 5 | UNION | votes | const | PRIMARY | PRIMARY | 4 | const | 1 | |
+----+--------------+------------------+-------+---------------+---------+---------+-------+------+----------------------------------+
| 6 | UNION RESULT | <union2,3,4,5,6> | ALL | NULL | NULL | NULL | NULL | NULL | |
+----+--------------+------------------+-------+---------------+---------+---------+-------+------+----------------------------------+
如果结束
这个If语句总是进入Else子句。在我看来,preferencedReader(“preference”)总是包含0以外的内容,即使查询返回0也是如此。此时是否存在类型不匹配或我误解了其他内容?您正在声明
首选项Reader
对象,并将其设置为Nothing。您确定没有收到空引用异常吗?它永远不会有行,因为它是Nothing
。当查询返回preference=2时,preferencedReader(“preference”)也会返回2。从这一点来看,我认为读者确实会从表中返回内容,即使它声明为“Nothing”。但是我不知道当查询=0时读取器返回什么,因为它似乎总是跳过查询的返回值。换句话说,如果查询返回除0以外的任何内容,则读取器将按预期在else语句中返回所有内容,但如果查询返回0,则if语句中不会返回任何内容。由于不清楚返回的是什么内容,因此,请使用convert.toint32,使用Integer.TryParse,如果Null通过,它将返回False。如果您省略了读卡器声明和检查.HasRows之间的代码,那么是吗?您的权利-对不起,我绝对忽略了。我没看到-谢谢你指出这一点。我刚刚编辑了代码以填充缺少的代码。:)
+----+--------------+------------------+-------+---------------+---------+---------+-------+------+----------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | extra |
+----+--------------+------------------+-------+---------------+---------+---------+-------+------+----------------------------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | PRIMARY | NULL | NULL | 5 | Using where; Using temporary |
+----+--------------+------------------+-------+---------------+---------+---------+-------+------+----------------------------------+
| 2 | DERIVED | votes | const | PRIMARY | PRIMARY | 4 | const | 1 | |
+----+--------------+------------------+-------+---------------+---------+---------+-------+------+----------------------------------+
| 3 | UNION | votes | const | PRIMARY | PRIMARY | 4 | const | 1 | |
+----+--------------+------------------+-------+---------------+---------+---------+-------+------+----------------------------------+
| 4 | UNION | votes | const | PRIMARY | PRIMARY | 4 | const | 1 | |
+----+--------------+------------------+-------+---------------+---------+---------+-------+------+----------------------------------+
| 5 | UNION | votes | const | PRIMARY | PRIMARY | 4 | const | 1 | |
+----+--------------+------------------+-------+---------------+---------+---------+-------+------+----------------------------------+
| 6 | UNION RESULT | <union2,3,4,5,6> | ALL | NULL | NULL | NULL | NULL | NULL | |
+----+--------------+------------------+-------+---------------+---------+---------+-------+------+----------------------------------+
Dim preferencedReader As MySqlDataReader = Nothing
preferencedReader = CmGetNextPreferencedCandidates.ExecuteReader()
If preferencedReader.HasRows Then
While preferencedReader.read()
If Convert.ToInt32(preferencedReader("preference")) = 0 Then
' Exhaust the vote
Else
' Redistribute the vote.
End If
End While