MySql Query - исключить повторяющиеся записи в количестве на основе даты

0

У меня есть таблица с именем post_likes, которая содержит следующие поля

  • id (int)
  • post_id (int)
  • type (enum) (FB_LIKES или LINKEDIN_LIKES)
  • user_hash (varchar) (уникальный идентификатор FB или Linkedin)
  • like_count (int)
  • created_date (временная метка)

Created_at основан на часовом поясе UTC.

Наша бизнес-логика заключается в том, что пользователь может добавлять LIKE один раз в день (на основе часового пояса PST) для сообщения. Значение: 1 LIKE от FB и 1 LIKE от Linkedin.

У меня есть условие в стороне приложения, чтобы проверить и ограничить людей, которые пытаются дать в тот же день. Так или иначе, некоторые пользователи добавили дубликаты LIKES за тот же день (это может быть проблема с кодом или веб-сервером. Просто оставьте это сейчас).

Мой текущий запрос выглядит следующим образом, чтобы получить счет каждого сообщения

SELECT 'id',  
       'title',  
       Sum(IF('type' = 'FB_LIKES', like_count, 0)) AS fb_like_counts, 
       Sum(IF('type' = 'LINKEDIN_LIKES', like_count, 0)) AS linkedin_like_counts, 
       Sum('like_count') AS total_like_counts 
FROM   'post_likes' 
GROUP  BY 'title'
ORDER  BY 'total_like_counts' DESC;

Теперь я хочу получить подсчеты DISTINCT. потому что у некоторых из них есть дубликат в тот же день. Здесь тот же самый пользователь может понравиться на следующий день.

  • Поэтому нужно добавить условие, основанное на часовом поясе PST, и исключить дублирование понравившихся в тот же день

Примечание: Извините за мой плохой английский и спасибо заранее

  • 1
    Пожалуйста, включите пример данных и ожидаемый результат в вашем вопросе
Теги:

3 ответа

0
Лучший ответ

Извините за последнее обновление. Ниже мой последний запрос, который дает правильный результат

SELECT 'id', 
   'title', 
   Sum(IF('type' = 'FB_LIKES', like_count, 0))       AS fb_like_counts, 
   Sum(IF('type' = 'LINKEDIN_LIKES', like_count, 0)) AS linkedin_like_counts, 
   Sum('like_count')                                 AS 
   total_like_counts  FROM   (SELECT *, 
           Date_format(Convert_tz(created_at, '+00:00', '-8:00'), '%Y-%m-%d' 
   ) AS date_pst 
    FROM   'post_likes' 
    GROUP  BY type, 
              title, 
              date_pst, 
              uid_hash) AS D1 
    GROUP  BY 'title' 
    ORDER  BY 'total_like_counts' DESC; 
1

Вам просто нужно внести несколько корректировок в свой запрос, чтобы выбрать отличную дату из вашей таблицы. Для следующего решения я добавил новый оператор select, чтобы вернуть одну и ту же таблицу post_likes, но с определенными датами. Это позволит мне запустить мой запрос в отфильтрованном наборе post_likes

SELECT 'id',  
       'title',
       'user_hash' as liked_user,
       Sum(IF('type' = 'FB_LIKES', like_count, 0)) AS fb_like_counts, 
       Sum(IF('type' = 'LINKEDIN_LIKES', like_count, 0)) AS linkedin_like_counts, 
       Sum('like_count') AS total_like_counts 
FROM   (SELECT * FROM post_likes GROUP BY DATE_FORMAT('created_date', '%m %d %Y'), user_hash, type) AS post_likes
GROUP  BY 'title', DATE_FORMAT('created_date', '%m %d %Y'), user_hash
ORDER  BY 'total_like_counts' DESC;

Вы можете использовать следующий запрос для воссоздания схемы

CREATE TABLE 'post_likes' (
  'id' int(11) NOT NULL,
  'title' varchar(255) DEFAULT NULL,
  'post_id' int(11) NOT NULL,
  'type' enum('FB_LIKES','LINKEDIN_LIKES') NOT NULL,
  'user_hash' varchar(30) NOT NULL,
  'like_count' int(11) NOT NULL,
  'created_date' timestamp NULL DEFAULT CURRENT_TIMESTAMP
);

insert into post_likes VALUES (
  1, 'A', 1, 'FB_LIKES', 'ABC', 1, '2018-06-25 05:49:41'
);

insert into post_likes VALUES (
2, 'A', 1, 'FB_LIKES', 'DEF', 1, '2018-06-25 05:50:01'
);

insert into post_likes VALUES (
3, 'A', 1, 'LINKEDIN_LIKES', 'ABC', 1, '2018-06-25 05:50:16'
);

insert into post_likes VALUES (
4, 'A', 1, 'LINKEDIN_LIKES', 'DEF', 1, '2018-06-25 05:50:23'
);

insert into post_likes VALUES (
5,'A', 1, 'LINKEDIN_LIKES', 'ABC', 1, '2018-06-25 05:50:16'
);

insert into post_likes VALUES (
6, 'A', 1, 'FB_LIKES', 'DEF', 1, '2018-06-25 05:50:01'
);
0

Скажем ниже - вероятная структура таблицы

CREATE TABLE 'post_likes' (
  'id' int(11) NOT NULL,
  'title' varchar(255) DEFAULT NULL,
  'post_id' int(11) NOT NULL,
  'type' enum('FB_LIKES','LINKEDIN_LIKES') NOT NULL,
  'user_hash' varchar(30) NOT NULL,
  'like_count' int(11) NOT NULL,
  'created_date' timestamp NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;  

Ниже приведены примеры данных:

INSERT INTO 'post_likes' ('id', 'title', 'post_id', 'type', 'user_hash', 'like_count', 'created_date') VALUES
(1, 'A', 1, 'FB_LIKES', 'ABC', 1, '2018-06-25 05:49:41'),
(2, 'A', 1, 'FB_LIKES', 'DEF', 1, '2018-06-25 05:50:01'),
(3, 'A', 1, 'LINKEDIN_LIKES', 'ABC', 1, '2018-06-25 05:50:16'),
(4, 'A', 1, 'LINKEDIN_LIKES', 'DEF', 1, '2018-06-25 05:50:23'),
(5, 'A', 1, 'FB_LIKES', 'ABC', 1, '2018-06-26 05:50:38');

Вот запрос с полем даты, чтобы иметь уникальные записи по месяцам, учитывая, что в таблице нет дубликатов записей:

SELECT 'id', 'title', Sum(IF('type' = 'FB_LIKES', like_count, 0)) AS fb_like_counts, Sum(IF('type' = 'LINKEDIN_LIKES', like_count, 0)) AS linkedin_like_counts, Sum('like_count') AS total_like_counts, DATE_FORMAT('created_date', '%Y-%m-%d') AS 'liked_date' 
FROM 'post_likes' 
GROUP BY 'title', 'liked_date'
ORDER BY 'total_like_counts' DESC;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню