为什么';条件值是否与从MySQL表传递的查询匹配?

为什么';条件值是否与从MySQL表传递的查询匹配?,mysql,vb.net,Mysql,Vb.net,我有一个棘手的问题,我似乎也找不到任何解决办法。我已经扫描了这么多相关的问题,以获得灵感,但似乎没有以前的答案,解决我的问题。这个问题是我在一个类似的问题中提出的这些问题的演变——并且。所以我们走吧 我在VB.NET和MySQL中构建了一个投票系统,根据候选人的选票和第二优先选择在候选人之间传输选票(可以找到更多关于如何工作的信息) 我已经到了这样一个地步:如果有任何偏好需要重新分配,那么选票的重新分配就会完美地发挥作用。但是,如果选票上的所有优先候选人都已经被淘汰,那么选票就必须用尽,而这正是

我有一个棘手的问题,我似乎也找不到任何解决办法。我已经扫描了这么多相关的问题,以获得灵感,但似乎没有以前的答案,解决我的问题。这个问题是我在一个类似的问题中提出的这些问题的演变——并且。所以我们走吧

我在VB.NET和MySQL中构建了一个投票系统,根据候选人的选票和第二优先选择在候选人之间传输选票(可以找到更多关于如何工作的信息)

我已经到了这样一个地步:如果有任何偏好需要重新分配,那么选票的重新分配就会完美地发挥作用。但是,如果选票上的所有优先候选人都已经被淘汰,那么选票就必须用尽,而这正是程序上变得麻烦的地方。我有一个MySQL查询,在被淘汰候选人的每一张选票上查找下一个可用的偏好(2比剩下的候选人数量)。如果没有保留首选项,查询将返回NULL。为了避免这种情况,我使用COALESCE将NULL替换为0。然后,我尝试使用VB.NET中的If语句根据返回值执行不同的操作(0=用尽的投票,1=被淘汰的候选人,2到x=被淘汰的候选人投票的重新分配)。 出于某种原因(这是我的问题),If语句从不运行(因此永远不会解释0)。无论返回什么值,它都会运行到ELSE

这是MySQL查询。返回值“1”总是被忽略,因为它引用了将要删除的当前候选项:

    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