MySQL фильтрация результатов с результатами подзапроса

у меня есть две таблицы:

названия

  • Я бы
  • заглавие

запись

  • Я бы
  • запись
  • title_id
  • Идентификатор пользователя
  • время (отметка времени)

Мне нужно проверить, если новая запись подана после моей последней записи под этим названием. ищу запрос, который фильтрует обновления (отличные от моего user_id) для каждого заголовка и перечисляет результат с включенным номером, который показывает новые записи.


пример

названия

id | title

1 | Cars
2 | Computers

запись

id | entry    | title_id | user_id | time
1  | bmw      | 1        | 1       | 1418595811
2  | mercedes | 2        | 2       | 1418595812
3  | ibm      | 2        | 2       | 1418595813
4  | hp       | 2        | 3       | 1418595814
5  | dell     | 2        | 1       | 1418595815
6  | acer     | 2        | 3       | 1418595816
7  | asus     | 2        | 4       | 1418595817
8  | toshiba  | 2        | 4       | 1418595818
9  | ferrari  | 1        | 3       | 1418595819
10 | toyota   | 1        | 4       | 1418595820
11 | honda    | 1        | 2       | 1418595821

Ожидаемые результаты:

if user_id = 1 ->

Cars (3)
Computers (3)

if user_id = 2 ->

Cars (0)
Computers (5)

if user_id = 3 ->

Cars (2)
Computers (2)

как видно выше, [user_id = 1] отправляет автомобиль (bmw). после этого другие пользователи отправляли записи под этим заголовком. Мне нужен запрос для новых представлений для каждого заголовка после последнего представления пользователя. (используя поле времени)
нужно только, если есть новая подача. если так, сколько?

мне нужно что-то вроде этого:

select count(entry)
from entry where time>last_entry_time[user_id]
left join titles
where title.id=entry.title_id

0

Решение

Это делает это для всех пользователей:

SELECT e1.user_id, t.title, COUNT(e2.id) AS count
FROM titles AS t
LEFT JOIN (SELECT user_id, title_id, MAX(time) AS last_entry
FROM entry
GROUP BY user_id, title_id) AS e1
ON t.id = e1.title_id
LEFT JOIN entry AS e2 ON e2.title_id = e1.title_id AND e2.user_id != e1.user_id AND e2.time > e1.last_entry
GROUP BY e1.user_id, t.id
ORDER BY e1.user_id, t.title

DEMO

Чтобы сделать это для конкретного пользователя:

SET @user_id = 1;

SELECT t.title, COUNT(e2.id) AS count
FROM titles AS t
LEFT JOIN (SELECT user_id, title_id, MAX(time) AS last_entry
FROM entry
WHERE user_id = @user_id
GROUP BY title_id) AS e1
ON t.id = e1.title_id
LEFT JOIN entry AS e2 ON e2.title_id = e1.title_id AND e2.user_id != @user_id AND e2.time > e1.last_entry
GROUP BY t.id
ORDER BY t.title

DEMO

1

Другие решения

Я не уверен, правильно ли я понимаю ваш вопрос. Попробуй это

select e.id, e.tittle_id, e.user_id from entry e
where e.id not in(
select e.id from entry e, titles t where t.id = e.id
)
0

По вопросам рекламы [email protected]