MySQL Query (или Doctrine 1.2 запрос) - получить самый последний элемент из объединенной таблицы и фильтра

0

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

Отфильтруйте контакты с помощью activity_type_id, только отображая контакты, в которых самая последняя активность имеет желаемый объект activity_type_id или NULL (нет активности)

Таблицы структурированы следующим образом:

Контакт может иметь много видов деятельности различных типов.

activity:
id
contact_id
activity_type_id
date

contact:
id
first_name
last_name

У меня это до сих пор:

SELECT * FROM (
    SELECT c.first_name, c.last_name, a.activity_type_id, MAX(a.date) AS maxdate 
    FROM contact AS c
    LEFT JOIN activity AS a ON a.contact_id = c.id
    GROUP BY c.id
    ORDER BY c.first_name  ASC
) AS act

затем добавив это для фильтрации:

WHERE activity_type_id = 3 /* <- I would like to filter using this */

Однако я получаю неправильный activity_type_id для контактов, которые имеют несколько действий.

В конечном итоге я хотел бы использовать это как запрос Doctrine 1.2, но мне нравится сначала работать с MySQL.

Thankyou.

Окончательное решение

SELECT c.first_name, c.last_name, a.activity_type_id FROM contact c
  LEFT JOIN
    (SELECT a1.contact_id, a1.date, a1.activity_type_id FROM activity a1
      JOIN (SELECT contact_id, MAX(DATE) DATE FROM activity GROUP BY contact_id) a2
        ON a1.contact_id = a2.contact_id AND a1.date = a2.date
     ) a
  ON c.id = a.contact_id  
WHERE a.activity_type_id = 2;

Финал, где причина может быть скорректирована, чтобы возвращать различные виды активности или установить значение NULL.

DQL 1.2 Совместимая версия

SELECT * FROM contact c
LEFT JOIN activity ON c.id = contact_id
WHERE ROW (c.id,DATE) IN (SELECT contact_id, MAX(date) date FROM activity  GROUP BY contact_id)
AND activity_type_id = 2
Теги:
join
max
doctrine-1.2

1 ответ

1
Лучший ответ

Попробуйте этот запрос -

edit: добавлен a1.activity_type_id

SELECT c.first_name, c.last_name FROM contacts c
  LEFT JOIN
    (SELECT a1.contact_id, a1.date, a1.activity_type_id FROM activity a1
      JOIN (SELECT contact_id, MAX(date) date FROM activity GROUP BY contact_id) a2
        ON a1.contact_id = a2.contact_id AND a1.date = a2.date
     ) a
  ON c.contact_id = a.contact_id
WHERE a.contact_id IS NULL OR a.activity_type_id = 3;
  • 0
    Замечательный. Спасибо ... Мне нужно потратить некоторое время на выяснение этого ... это должно быть интересно, чтобы конвертировать в DQL. Я должен был сделать небольшие исправления. Я поставил последний вопрос в вопросе.
  • 0
    Хорошо, я объясню немного. Подзапрос возвращает подмножество правильных строк - самые последние строки по contact_id .
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню