mysql - 我可以区分同一列的值吗?

时间:2018-03-25 22:13:45

标签: mysql

有没有办法在同一列中使两个或多个相同的值在数据库引擎中不同? 想象一下,我有这样的专栏:

id | votes 
----------
1  |  20
2  |  20
3  |  19
4  |  16
5  |  15

我必须以这种方式使所有选票不同,我将两个相等的值中的第一个递增,然后减去另一个。 经过一次迭代后,我的数据库应如下所示:

----------
1  |  21
2  |  19
3  |  19
4  |  16
5  |  15

因为我们仍然有两个相同的值(id 2和3),所以我们继续进行第二次迭代:

----------
1  |  21
2  |  20
3  |  18
4  |  16
5  |  15

我能以某种方式更新mysql数据库吗?或者我应该选择值,在php中进行比较并更新?

谢谢!

2 个答案:

答案 0 :(得分:0)

假设您已将所有值读入带有索引ID和值投票的数组$数组中(按降序排序,即使用ORDER BY votes DESC),此循环应该可以解决问题:

$keys = array_keys($array);
$c = count($array);
while ($c != count(array_unique($array))) {
    for ($i = 0; $i < $c - 1; ) {
        $k1 = $keys[$i];
        $k2 = $keys[++$i];
        if ($array[$k2] == $array[$k1]) {
            while ($array[$k2] == $array[$k1] && $i < $c) {
                $array[$k2]--;
                if (++$i < $c) $k2 = $keys[$i];
            }
            $array[$k1]++;
        }
    }
}
print_r($array);

例如输入:

$array = array(1=>20,2=>20,3=>19,4=>16,5=>15, 6=>15, 9=>13, 10=>13, 11=>12);

输出是:

Array ( [1] => 21 
        [2] => 20 
        [3] => 18 
        [4] => 17 
        [5] => 16 
        [6] => 15 
        [9] => 13 
        [10] => 12 
        [11] => 11 ) 

它还将处理重复值的长序列,保留原始的排序顺序,例如对

$array = [15,15,15,15,15];

输出是:

Array ( [0] => 16 
        [1] => 15 
        [2] => 14 
        [3] => 13 
        [4] => 11 )

答案 1 :(得分:0)

这与您的预期结果不完全一致,但可能会导致您达成可接受的妥协。

MySQL还没有诸如rank(),dense_rank()或row_number()之类的窗口函数,但你可以使用@variables来模仿row_number,如下所示。

请参阅this demo

MySQL 5.6架构设置

CREATE TABLE Table1
    (`id` int, `votes` int)
;

INSERT INTO Table1
    (`id`, `votes`)
VALUES
    (1, 20),
    (2, 20),
    (3, 19),
    (4, 16),
    (5, 15)
;

查询1

SELECT
      t.id
    , t.votes
    , m.v - @row_num         AS adjusted_votes
    , @row_num := @row_num+1 AS RowNumber
FROM Table1 t
CROSS JOIN (SELECT MAX(votes) v from Table1) m
CROSS JOIN (SELECT @row_num :=0) vars
ORDER BY
      t.votes DESC
    , t.id

<强> Results

| id | votes | adjusted_votes | RowNumber |
|----|-------|----------------|-----------|
|  1 |    20 |             20 |         1 |
|  2 |    20 |             19 |         2 |
|  3 |    19 |             18 |         3 |
|  4 |    16 |             17 |         4 |
|  5 |    15 |             16 |         5 |

请注意,id 2减少20到19似乎完全是任意的,当值相等时,id仅用作打破平局。