React.js и Redux - Как создать «популярную» страницу - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь создать страницу в своем приложении, которая показывает список самых популярных событий для перехода.События, которые наиболее «заинтересованы» и «собираются» результаты.

Я использую 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}
      ])
    })
}

1 Ответ

0 голосов
/ 29 августа 2018

Подход, который я выбрал бы, состоял бы в том, чтобы SUM () подсчитывал количество событий для каждой из 2 таблиц, а затем ОБЪЕДИНЯЛ их вместе:

В 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 ().Но в этом случае сложность, создание нескольких вычисляемых полей и отсутствие входных переменных ... это просто проще.

Надеюсь, это поможет.(Отказ от ответственности - я не запускал код, поэтому он, вероятно, не идеален.)

...