Я пытаюсь написать sql для получения посещений профиля пользователей и их посещений других профилей.
Схема БД
mysql> desc user_views;
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| user_id | mediumint(8) | NO | PRI | 0 | |
| visitor_id | mediumint(8) | NO | PRI | 0 | |
| created_at | datetime | NO | | NULL | |
+------------+--------------+------+-----+---------+-------+
mysql> desc users;
+--------------------+----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+----------------+------+-----+---------+----------------+
| id | mediumint(8) | NO | PRI | NULL | auto_increment |
| first_name | varchar(255) | YES | | NULL | |
| last_name | varchar(255) | YES | | NULL | |
| email_address | varchar(255) | NO | UNI | NULL | |
| username | varchar(128) | NO | UNI | NULL | |
| algorithm | varchar(128) | NO | | sha1 | |
| salt | varchar(128) | YES | | NULL | |
| password | varchar(128) | YES | | NULL | |
| is_active | tinyint(1) | YES | MUL | 1 | |
+--------------------+----------------+------+-----+---------+----------------+
Мои посетители SQL
Это отображение пользователя только один раз.Например, если я обновлю профиль пользователя А три раза, будет отображаться последнее посещение.Я хочу следить за каждым посещением, чтобы я мог сообщить пользователю его уникальные просмотры и общее количество просмотров профиля.
SELECT v.visitor_id FROM user_views v, users u, users u2
WHERE v.user_id = :user_id AND v.visitor_id != :user_id
AND u.id = v.user_id AND u2.id = v.visitor_id
AND u.is_active = 1 AND u2.is_active = 1
AND NOT EXISTS
(
SELECT * FROM user_profile_view v2
WHERE v2.visitor_id = v.visitor_id
AND v2.created_at > v.created_at
)
ORDER BY v.created_at DESC LIMIT 0, 10
Посещенный SQL
Снова то же самое для этого,Пользователь будет отображаться только один раз.
SELECT v.user_id FROM user_views v, users u, users u2
WHERE v.user_id != :visitor_id AND v.visitor_id = :visitor_id
AND u.id = v.user_id AND u2.id = v.visitor_id
AND u.is_active = 1 AND u2.is_active = 1
AND NOT EXISTS
(
SELECT * FROM users_view v2
WHERE v2.user_id = v.user_id AND v2.created_at > v.created_at
)
GROUP BY v.user_id
ORDER BY v.created_at DESC LIMIT 0, 10
SQL работает нормально, но я хочу знать, считаете ли вы, что SQL можно улучшить, или я должен написать его более эффективным способом.