React.js和Redux-如何创建一个“流行”页面

时间:2018-08-27 02:28:26

标签: reactjs redux sqlite knex.js

我正在尝试在我的应用程序上创建一个页面,该页面显示要去的最受欢迎事件的列表。对结果“最感兴趣”和“最感兴趣”的事件。

我在数据库中使用knex和sqlite3,目前有用于用户及其感兴趣的事件的联结表,以及用于用户及其将要发生的事件的联结表。

我将如何构造一个页面以返回与事件互动最多的页面?我是否需要在事件表中添加某种类型的计数列并返回计数最大的事件(具有每次选择计数都会增加的功能……)?

我主要不知道从何处着手/如何着手。

谢谢!


到目前为止,这是我的数据结构:

事件表:

Z

种子数据:user_goingto_events

cublasDgemm(...,real_a,...,somearray,...,anotherarray,...)

种子数据:user_interestedin_events

exports.up = (knex, Promise) => {
  return knex.schema.hasTable('events').then(function (exists) {
    if (!exists) {
      return knex.schema.createTable('events', (table) => {
        table.increments('id').primary()
        table.string('eventName')
        table.date('date_start')
        table.string('time_start')
        table.date('date_end')
        table.string('time_end')
        table.string('image')
        table.string('description')
        table.string('access')
        table.string('tickets')
        table.string('restrictions')
        table.string('eventType')
      })
    }
  })
}

exports.down = (knex, Promise) => {
  return knex.schema.dropTable('events')
}

1 个答案:

答案 0 :(得分:0)

我将采用的方法是对两个表中的每个表的SUM()事件计数,然后将它们联合在一起:

在SQL中如下所示:

select event_id, count(*) as cnt_interest, 0 as cnt_going
   from user_interestedin_events
   group by event_id
UNION
select event_id, 0 as cnt_interest, count(*) as cnt_going
   from user_goingto_events
   group by event_id;

然后,我将使用该结果作为输入来汇总每个事件产生单个行的计数。从理论上讲,如果您有一个名为“ part1data”的结果游标,则该SQL将如下所示:

select eventName, event_id, sum(cnt_interest) as sum_interest, sum(cnt_going) as sum_going
   from part1data
   left join events on events.id = event_id
   group by event_id;
   order by sum(cnt_interest)+sum(cnt_going) desc

您可以看到我按受欢迎程度对其进行了订购,并且为了方便用户,还通过左连接添加了事件名称。

现在将其放在Knex中。由于这有点复杂,所以我将其嵌入为raw()SQL并按以下方式运行它:

const rawRpt = 
 `select eventName, event_id, sum(cnt_interest) as sum_interest, sum(cnt_going) as sum_going
   from 
     ( select event_id, count(*) as cnt_interest, 0 as cnt_going
          from user_interestedin_events
          group by event_id
        UNION
       select event_id, 0 as cnt_interest, count(*) as cnt_going
          from user_goingto_events
          group by event_id
     )
   left join events on events.id = event_id
   group by event_id;
   order by sum(cnt_interest)+sum(cnt_going) desc`

return Knex.raw(rawRpt);
   .on('query-error', function(ex, obj) {
        console.log("KNEX query-error ex:", ex, "obj:", obj);
   })
   .then(function(retList) {
        console.log("Returns:", retList);
   });

您可能会看到我在第二个查询中嵌入了第一个查询。我还要指出,对于90%的Knex SQL,我不使用raw()。但是在这种情况下,复杂度高,创建多个计算字段并且没有输入变量……这会更容易。

我希望这会有所帮助。 (免责声明-我没有运行代码,所以它可能并不完美。)