基于变量算法排序数组结果 - MYSQL& PHP

时间:2014-02-25 14:42:18

标签: mysql algorithm timestamp

我有一个嵌套在PHP while循环中的数组,它多次输出一组论坛帖子。我想基于算法对数组结果进行排序 - 但是我不想对算法进行硬编码,因此我可以在以后测试不同的变量。注意 - 我不打算对数组中的项进行排序,而是在循环时输出数组20次以上的最终输出。

目前我有2个表 - 带有行(3000 +)的论坛表:

id     |    name     |     date_add     |     votes    |    ...     |
1      |  Test Name  |    1234567890    |       2      |    ...     |
...    |     ...     |       ...        |      ...     |    ...     |

另一个表包含我想要传递给计算的算法变量,只有一行:

id     |   vote_reduction   |  time_variable    |     gravity    |
1      |         1          |        2          |      1.8       |

我正在使用的特定算法根据日志的生成时间(以小时为单位),有多少票数和重力因子对信息进行排序,使其对时间更敏感。在全: (vote - vote_reduction)/((小时直播+时间变量)^重力)

到目前为止,我已经设法做到这一点,出现了问题,但我无法弄清楚:

SELECT forum.*,
((forum.votes - algorithm.vote_reduction)/POW(((TIMESTAMPDIFF(HOUR, SYSDATE(), forum.date_add)) + algorithm.time_variable),algorithm.gravity)) AS algorithm.al,
forum.name, forum.id
FROM forum as forum 
LEFT JOIN algorithm AS algorithm ON (algorithm.id='1')
ORDER BY algorithm.al

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我还没有测试过算法的结果,但是如果只删除算法,查询会返回al的结果。来自algorithm.al。我不认为你可以创建一个像它是表的一部分的列别名。令我困惑的是你说它在你的机器上运行。它不是在SQL Fiddle上运行而且是在抛出错误。

SELECT forum.*,
((forum.votes - algorithm.vote_reduction)/POW(((TIMESTAMPDIFF(HOUR, SYSDATE(), forum.date_add)) + algorithm.time_variable),algorithm.gravity)) AS al
FROM forum AS forum
LEFT JOIN algorithm AS algorithm ON (algorithm.id='1')
ORDER BY al

Link to SQL fiddle

答案 1 :(得分:0)

代码中有一些错误如下:

  1. 使用名称“algorithm”创建别名与MySQL冲突 该子句也称为ALGORITHM
  2. 计算(至少是这样的     上面编辑过的)在POW子句中创建了太多的值
  3. 在''中封装所有已声明的别名会使代码更加完整     证明 - 但是ORDER BY子句不喜欢引号(所以在那里删除它们)
  4. SYSDATE()和forum.date_add字段的格式不同 - 后者是时间戳
  5. 修复:

    SELECT forum.*, TIMESTAMPDIFF(HOUR, from_unixtime(bd.date_add), NOW()) as 'timedif'
    ((forum.votes - alg.vote_reduction)/POW(('timedif' + alg.time_variable),alg.gravity)) AS 'al'
    FROM forum AS forum
    LEFT JOIN algorithm AS 'alg' ON (alg.id='1')
    ORDER BY al