У меня есть этот запрос ( SQLFiddle ):
SELECT
c.name,
a.user_id,
a.status_id,
a.title,
a.rtime,
u.user_name,
s.status_name
FROM company c
LEFT JOIN action a ON a.company_id=c.id
LEFT JOIN user u ON u.id=a.user_id
LEFT JOIN status s ON s.id=a.status_id
WHERE u.user_name='Morgan'
-- WHERE c.name='Fiddle'
GROUP BY c.id
HAVING a.rtime IS NULL OR a.rtime = (
SELECT max(rtime)
FROM action a2
WHERE deleted IS NULL
AND a2.company_id = c.id
)
Проблема 1
Я хочу перечислить все компании и показать пользователю и статус, где они в последний раз совершали действия в отношении компании. При этом покажите компании, где не было предпринято никаких действий.
Проблема 2
Мне также нужно иметь возможность искать пользователя по имени, тем самым выбирая все компании, в которых этот пользователь выполнял последнее действие. Запрос сделан из формы, поэтому я могу вводить переменные.
Я не могу изменить базу данных SCHEMA на данный момент, но советы для будущей миграции очень ценятся.
Я пытался связать это вместе с, INNER JOIN ( SELECT.. ) t ON
но я не могу обдумать это.
Я также попробовал методы отсюда , здесь и здесь, но я не могу понять человека с последней деятельностью правильно.
Версия MySQL: 5.5.16. Таблица компании имеет около 1 млн рядов, а таблица действий на 70 тыс. Растет. Производительность важна для меня здесь.
Как это можно решить?
MAX(Marks)
perTaskID
, вы хотитеMAX(ActivityDate)
perCompany
.) Нет большой разницы, если у вас есть одна таблица или объединение.Ответы:
Ваш запрос может быть упрощен до:
Индекс на
(deleted, company_id, rtime)
сделает подзапрос производной таблицы эффективным. Я полагаю, у вас уже есть индексы для столбцов, используемых для объединений и дляCompany (name)
.SQL-Fiddle
источник
После того, как я попробовал разные ответы, я заработал, но в моей настройке он оказался медленным.
ypercube указал мне на ответ, который указал на другие подобные вопросы о том, как MySQL группирует результаты. Это привело меня к этому ресурсу, где я наконец понял, что происходит.
В результате получается такой запрос:
Вот скрипка с рабочим запросом
источник
Вам необходимо переместить таблицы пользователя, действия и состояния в подзапрос, например так:
SQL Fiddle
источник