MYSQL Присоединиться только к максимальной строке с данными из нескольких таблиц

0

У меня есть запрос, который выбирает свойства, и мне нужно присоединиться к ним, чтобы получить самую последнюю активность на каждом из них, где this activity_status = 3 (закрытая сделка). когда я получу это, мне нужно получить банк, который закрыл сделку (banks.is_reward = 1)

Проблема в том, что данные распределены по многим таблицам, поэтому, когда я присоединяюсь, чтобы получить все результаты, а затем попытаюсь ограничить max(activity_date), мне нужно сгруппировать результаты, а затем я не получу правильные данные из других столбцов.

Вот скрипт SQL

я могу сделать

Select * from properties
join
(SELECT deal_properties.property_id, activity.deal_id, activity.activity_date, banks.bank_id
FROM deal_properties
JOIN activity on activity.deal_id = deal_properties.deal_id
AND activity.activity_status = 3
JOIN banks ON banks.deal_id = activity.deal_id
AND banks.is_rewarded = 1) a
on a.property_id = properties.property_id;

и это даст мне все закрытые свойства, с вознагражденными банками, но я не могу ограничить это max(activity_date).

Теги:
join
max

2 ответа

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

Опция 1

Следующее дает то, что вы ищете, следуя вашей текущей мысли:

SELECT LastActivities.property_id, ActivityDetails.bank_id, LastActivities.activity_date 
FROM (
      SELECT p.property_id, MAX(a.activity_date) AS activity_date
      FROM properties p
      JOIN deal_properties dp
          ON dp.property_id = p.property_id
      JOIN activity a
          ON a.deal_id = dp.deal_id AND a.activity_status = 3
      GROUP BY p.property_id
) LastActivities

JOIN(
      SELECT a.activity_date, dp.property_id, b.bank_id 
      FROM deal_properties dp
      JOIN activity a
          ON a.deal_id = dp.deal_id AND a.activity_status = 3
      JOIN banks b
          ON b.deal_id = a.deal_id AND b.is_rewarded = 1
) ActivityDetails
  ON ActivityDetails.property_id = LastActivities.property_id 
  AND ActivityDetails.activity_date = LastActivities.activity_date

Вот скрипка: ЗДЕСЬ

Вариант 2

Ниже приведен еще один способ получить те же результаты... Это должно быть немного более эффективным, поскольку в нем есть только одна производная таблица вместо двух.

SELECT p.property_id, b.bank_id, a.activity_date
FROM activity a
JOIN banks b
  ON b.deal_id = a.deal_id AND b.is_rewarded = 1
JOIN deal_properties dp
  ON dp.deal_id = a.deal_id
JOIN properties p
  ON p.property_id = dp.property_id
JOIN(SELECT p.property_id, max(a.activity_date) AS activity_date
    FROM activity a
    JOIN deal_properties dp
      ON dp.deal_id = a.deal_id
    JOIN properties p
      ON p.property_id = dp.property_id
     GROUP BY p.property_id
) latest
  ON latest.activity_date = a.activity_date AND latest.property_id = p.property_id

WHERE a.activity_status = 3

Вот скрипка для варианта 2: ЗДЕСЬ

  • 0
    DarbyM, похоже, работает. Я предпочел бы что-то более эффективное, я приму это, если я не могу найти что-то лучшее.
  • 0
    Есть более эффективный .. Я только не закончил полировать это .. Я обновлю, когда закончу.
Показать ещё 2 комментария
0

вам кажется, что вам нужен

Select * from properties p
inner join 
( SELECT deal_properties.property_id as property_id , max(activity.activity_date) max_date
  FROM deal_properties
  INNER JOIN activity on activity.deal_id = deal_properties.deal_id 
                   AND activity.activity_status = 3
  INNER JOIN banks ON banks.deal_id = activity.deal_id AND banks.is_rewarded = 1
  group by property_id
  ) a on  a.property_id = p.property_id; 
  • 0
    scaisEdge, это работает, чтобы получить мне последнее действие, но проблема, как я упомянул, заключается в том, что для этого мне также нужен bank_id , а когда вы group by property_id , он не получает правильный bank_id. Вы можете видеть это в Скрипке, которую я связал.
  • 0
    обновите свой вопрос с правильной выборкой данных и ожидаемым результатом
Показать ещё 3 комментария

Ещё вопросы

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