有没有办法根据其他列自动查找列的产品

时间:2016-04-09 14:38:24

标签: php mysql laravel eloquent

是否有办法根据其他列自动查找列的产品。

我有一个名为posts

的数据库表
  

发布表

  • ID
  • USER_ID
  • rank = affinity x weight x decay
  • 亲和力
  • 重量
  • 衰变

如何实现这一点rank = affinity x weight x decay?

3 个答案:

答案 0 :(得分:3)

如果您使用的是MySQL 5.7.6,那么您也可以使用viewPager.setOffscreenPageLimit(numberOfPages);

docs(您必须向下滚动到"创建表格和生成的列")

  

从MySQL 5.7.6开始,CREATE TABLE支持规范   生成的列。

生成的列可以是

  • 虚拟,即在读取列时动态计算,类似于@GordonLinoff建议的视图

  • 存储,即它们占用数据库中的空间并在每次插入或更新行时计算

示例:

GENERATED COLUMNS

-- calculated on-the-fly when reading:
create table post (
    id       int,
    user_id  varchar(20),
    affinity int,
    weight   int,
    decay    int,
    RANK     int GENERATED ALWAYS AS (affinity*weight*decay) VIRTUAL
);

答案 1 :(得分:2)

MySQL中最简单的方法可能是定义一个进行计算的视图:

create view v_t as
    select t.*, (affinity*weight*decay) as rank
    from t;

然后,您可以在代码中使用视图而不是表格,值将在那里。

答案 2 :(得分:0)

您提出的计算存在内在问题(可能,或者至少这是我的理解),因为affinityweightdecay的值不同,您可能最终会遇到问题具有相同的结果,例如3 X 4 X 5 = 5 X 3 X 4.因此,如果您尝试查找等级为60的记录,您将获得至少两个(使用上面的示例)。这是你想要的?如果不是,那么生成组合排名会更加清晰,类似于aaa-bbb-ccc,其中aaa对应于affinity(范围000-999),以及等等。 然而,不建议使用上面提出的视图解决方案,因为每次查询时都会触发计算。

另一种选择是在这三个字段上设置触发器,这样,只要任何字段的值发生变化,就会重新计算排名字段并将其部署在相应的列中。