计算存储在Base Six中的Numeric Varchar列

时间:2015-12-21 20:11:54

标签: php mysql modular-arithmetic

我有一个表格,用于在VARCHAR列中存储数值,此列存储以六位数字计算的值。含义:

  

3.5 = 3 + 5/6

     

9.4 = 3.4 + 5.6

我需要获取这些行中值的总和。我知道我需要根据id分隔它们,然后添加特定的ID' base-sixe数字在一起,但我不知道从哪里开始。有没有简单的方法呢?

2 个答案:

答案 0 :(得分:1)

您可以使用以下代码将这些数字转换为普通数字:

SUBSTRING_INDEX(column, '.', 1) + IF(LOCATE(column, '.'), SUBSTRING_INDEX(column, '.', -1)/6, 0)

然后,您可以在SUM()中使用此表达式添加表格中的所有列,也可以将其与+一起使用,以便相互添加不同的列。 E.g。

SELECT SUM(SUBSTRING_INDEX(column, '.', 1) + IF(LOCATE(column, '.'), SUBSTRING_INDEX(column, '.', -1)/6, 0)) AS total
FROM yourTable

如果您还需要将总和转换回基础6分数表示,您可以使用:

CONCAT(FLOOR(total), '.', ROUND(MOD(total, 1) * 6)

因此完整查询可能如下所示:

SELECT CONCAT(FLOOR(total), '.', ROUND(MOD(total, 1) * 6) AS total
FROM (SELECT SUM(SUBSTRING_INDEX(column, '.', 1) + 
                 IF(LOCATE(column, '.'), SUBSTRING_INDEX(column, '.', -1)/6, 0)) AS total
      FROM yourTable) as subquery

答案 1 :(得分:0)

您可以向表中添加一个新的虚拟列,每次更改时,MySQL都会存储规范化的值。所以你可以总结这个专栏。

仅更改列'col'

的Tablename和名称
ALTER TABLE mytable
  ADD COLUMN norm float AS (FLOOR(col) + MOD(col, 1) / 0.6 ) PERSISTENT;

如果需要,您还可以在新字段上添加索引。

请告诉我它是否适合您