У меня есть таблица с именем post_likes, которая содержит следующие поля
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. потому что у некоторых из них есть дубликат в тот же день. Здесь тот же самый пользователь может понравиться на следующий день.
Примечание: Извините за мой плохой английский и спасибо заранее
Извините за последнее обновление. Ниже мой последний запрос, который дает правильный результат
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;
Вам просто нужно внести несколько корректировок в свой запрос, чтобы выбрать отличную дату из вашей таблицы. Для следующего решения я добавил новый оператор 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'
);
Скажем ниже - вероятная структура таблицы
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;