MySQL - получать последние посещения пользователей. отображать пользователя только один раз - PullRequest
0 голосов
/ 05 октября 2011

У меня есть таблица user_profile_view:

Определение выглядит следующим образом:

+------------+------------+------+-----+---------+----------------+
| Field      | Type       | Null | Key | Default | Extra          |
+------------+------------+------+-----+---------+----------------+
| id         | bigint(20) | NO   | PRI | NULL    | auto_increment |
| user_id    | bigint(20) | NO   | MUL | NULL    |                |
| viewer_id  | bigint(20) | NO   | MUL | NULL    |                |
| created_at | datetime   | NO   |     | NULL    |                |
| updated_at | datetime   | NO   |     | NULL    |                |
+------------+------------+------+-----+---------+----------------+

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

Простой запрос, такой как этот, вернет самые последние посещения профиля:

 SELECT v.* FROM user_profile_view v 
 WHERE v.user_id != 1 AND v.viewer_id = 1 
 ORDER BY created_at DESC LIMIT 0,10;

Набор результатов:

+-----+---------+-----------+---------------------+---------------------+
| id  | user_id | viewer_id | created_at          | updated_at          |
+-----+---------+-----------+---------------------+---------------------+
| 946 |      19 |         1 | 2011-10-05 19:20:19 | 2011-10-05 19:20:19 |
| 945 |      19 |         1 | 2011-10-05 19:16:15 | 2011-10-05 19:16:15 |
| 944 |       2 |         1 | 2011-10-05 19:12:02 | 2011-10-05 19:12:02 |
| 943 |      13 |         1 | 2011-10-05 19:11:45 | 2011-10-05 19:11:45 |
| 942 |      19 |         1 | 2011-10-05 19:10:41 | 2011-10-05 19:10:41 |
| 941 |       2 |         1 | 2011-10-05 19:06:35 | 2011-10-05 19:06:35 |
| 940 |      19 |         1 | 2011-10-05 18:53:04 | 2011-10-05 18:53:04 |
| 939 |      19 |         1 | 2011-10-05 18:51:56 | 2011-10-05 18:51:56 |
| 938 |      19 |         1 | 2011-10-05 18:46:59 | 2011-10-05 18:46:59 |
| 937 |      20 |         1 | 2011-10-05 18:42:35 | 2011-10-05 18:42:35 |
+-----+---------+-----------+---------------------+---------------------+

Однако я хочу только вернутьпользователь один раз .Поэтому, если я недавно просматривал профиль пользователя 3 раза, мне нужно только самое последнее посещение этого профиля, а затем отобразить следующего пользователя, которого я посетил ранее.

Это должно быть тривиально, но по какой-то причине язастрял.

Спасибо, ребята!

1 Ответ

1 голос
/ 05 октября 2011

Это на самом деле не тривиально.Это проблема "наибольшего числа групп".В некоторых вариантах SQL добавлены оконные функции, чтобы справиться с этим, я не уверен, имеет ли MySQL или нет.

Чтобы сделать это без оконных функций, вы можете проверить каждый потенциальный ответ, чтобы увидеть, существует ли в той же таблицестрока для того же user_id, но более позднего времени create_at):

SELECT v.* FROM user_profile_view v 
WHERE v.user_id != 1 AND v.viewer_id = 1 
   AND NOT EXISTS 
     (SELECT * FROM user_profile_view v2 
      WHERE v2.user_id = v.user_id AND v2.created_at > v.created_at)
ORDER BY created_at DESC LIMIT 0,10;

Обратите внимание, что связи (две записи с одинаковым значением made_at) будут возвращать обе строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...