Выбрать только уникальные записи из нескольких столбцов

У меня есть таблица, в которой регистрируются загрузки по IP, версии и платформе. Глядя на таблицу вручную, я вижу много дубликатов, где все 3 этих значения одинаковы. (пользователь, вероятно, просто нетерпелив) Я хотел бы использовать оператор SELECT, который отфильтровывает дубликаты и возвращает только одну из записей, если все 3 из этих значений одинаковы. Еще более продвинутый, если это возможно, у меня также есть поле даты/времени, которое использует CURRENT_TIMESTAMP. Было бы неплохо, если бы я мог включить дубликаты, если они из разных дней, но не из разных времен. Таким образом, я могу видеть, загружает ли тот же пользователь снова в другой день.

В основном я просто пытаюсь получить статистику о том, сколько уникальных людей загружают каждую версию каждый день. Структура таблицы БД проста...

ключ (AUTO_INCREMENT), дата (CURRENT_TIMESTAMP), ip, user_agent, платформа, версия

Программное обеспечение имеет версию (платформу) для Windows и Mac, и я предлагаю как текущую версию, так и несколько отдельных прошлых версий, которые были до серьезных изменений.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
49
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это то, что вы хотите? Он возвращает первую запись на каждую дату для комбинации ip/platform/version:

select t.*
from <tablename> t
where t.datetime = (select min(t2.datetime)
                    from <tablename> t2
                    where t2.ip = t.ip and
                          t2.platform = t.platform and
                          t2.version = t.version and
                          date(t2.datetime) = date(t.datetime)
                   );

Я должен проверить это, но это похоже на то, что я хочу

Dan 08.04.2019 20:01

ОК, извините за основной вопрос, но я не могу понять, что на самом деле использовать для t и t2. Имя таблицы — «загрузки». Я заменил все экземпляры «t» на «загрузки», но я не уверен, что делать с t2. Я попытался просто оставить его как t2, но я получаю 0 строк. SQL на самом деле не моя сильная сторона. Я использую его время от времени, но в основном я разработчик C/C++, поэтому я никогда не делаю ничего, кроме базовых вещей типа SELECT/INSERT.

Dan 11.04.2019 20:50

Вы можете использовать версию mysql 8.0+ row_number()

select * from (select *,
row_number()over(partition by ip,platform,date(datetime) order by datetime) rn
       from table_name 
) a where a.rn=1

Похоже, мой хост использует 5.7. Есть ли аналогичный способ сделать это в более низких версиях?

Dan 08.04.2019 19:58

@Dan нет, он доступен с 8 в mysql

Zaynul Abadin Tuhin 08.04.2019 20:00
Ответ принят как подходящий

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

SELECT ip, platform, version, COUNT(*) AS number_of_tries, max(download_date) AS last_download_date 
FROM downloads
GROUP BY ip, platform, version, DATE(download_date)

Тогда было бы относительно легко выполнить более сложную фильтрацию по группировке результатов по дням и т. д.

Другие вопросы по теме