React.js and Redux - 如何创建一个"流行"页面



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

我正在将 knex 和 sqlite3 用于我的数据库,目前有用于用户和他们感兴趣的事件的联结表,另一个用于用户和他们将要访问的事件。

如何构建页面以返回与事件交互最多的内容?我是否需要向事件表添加某种计数列并返回计数最大的事件(具有每次选择时计数都会上升的函数......

我主要不确定从哪里开始/如何处理这个问题。

谢谢!


到目前为止,我的数据结构如下:

事件表:

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')
}

种子数据:user_goingto_events

exports.seed = function(knex, Promise) {
// Deletes ALL existing entries
return knex('user_goingto_events').del()
.then(function () {
// Inserts seed entries
return knex('user_goingto_events').insert([
{id: 1, user_id: 1, event_id: 1},
{id: 2, user_id: 1, event_id: 2},
{id: 3, user_id: 1, event_id: 3},
{id: 4, user_id: 2, event_id: 4},
{id: 5, user_id: 2, event_id: 5},
{id: 6, user_id: 2, event_id: 6}
])
})
}

种子数据:user_interestedin_events

exports.seed = function(knex, Promise) {
// Deletes ALL existing entries
return knex('user_interestedin_events').del()
.then(function () {
// Inserts seed entries
return knex('user_interestedin_events').insert([
{id: 1, user_id: 1, event_id: 4},
{id: 2, user_id: 1, event_id: 5},
{id: 3, user_id: 1, event_id: 6},
{id: 4, user_id: 2, event_id: 1},
{id: 5, user_id: 2, event_id: 2},
{id: 6, user_id: 2, event_id: 3}
])
})
}

我将采取的方法是 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((。但在这种情况下,复杂性、创建多个计算字段以及没有输入变量......这更容易。

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

最新更新