有没有办法在同一列中使两个或多个相同的值在数据库引擎中不同? 想象一下,我有这样的专栏:
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中进行比较并更新?
谢谢!
答案 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仅用作打破平局。