Я делаю анализ данных в базе данных пользователей Instagram, мне нужно найти пользователей, которые являются ботами, проверяя, кому из пользователей понравились все фотографии на сайте, поскольку лайки всех фотографий практически невозможны для реального пользователя.
Формат таблицы
like
--
user_id
photo_id
created_at
photos
--
id
image_url
user_id
created_at
user
--
id
username
created_at
---- Пытался ----
SELECT photos.user_id, count(photos.user_id) AS users_in_photos, count(likes.user_id) AS users_in_likes
FROM photos
INNER JOIN likes
ON photos.user_id = likes.user_id
group by photos.user_id;
При этом я ожидал получить пользователей, которые есть и на фотографиях, и в таблице лайков, и, увидев их количество, я могу определить, кто из них боты.
То, что вы сказали, это сам мой вопрос, чтобы отметить всех пользователей, которым понравились все фотографии. Он не будет случайно помечать пользователя, поскольку пользователь не может лайкать тысячи фотографий. Прошу прощения, если мой вопрос был немного непонятен.
Количество всех фотографий можно получить с помощью:
SELECT COUNT(*) FROM photos
Предполагая, что в таблице user_id нет повторяющихся комбинаций photo_id и likes, используйте агрегацию и отфильтруйте ботов в предложении HAVING:
SELECT user_id
FROM likes
GROUP BY user_id
HAVING COUNT(*) = (SELECT COUNT(*) FROM photos);
Я тоже никогда не думала, что это можно сделать таким образом. Я пытался решить это с помощью соединений, если у вас есть решение с использованием соединений, поделитесь им.
Случай, который вы тестируете, кажется ОЧЕНЬ специфическим, будет ловить только ботов, которые делают это одно, а также будет ложно помечать пользователя, который на самом деле лайкает все изображения. Но ваш алгоритм проверит это. . . а в чем твой вопрос?