MYSQL仅在max行上连接多个表中的数据

MYSQL仅在max行上连接多个表中的数据,mysql,join,max,Mysql,Join,Max,我有一个选择属性的查询,我需要加入它们以获取每个属性的最新活动,其中活动\u status=3(已成交)。当我得到这些信息时,我需要找到完成交易的银行(banks.is_reward=1) 问题是数据分布在许多表中,所以当我加入以获取所有结果,然后尝试限制到max(activity\u date)时,我需要对结果进行分组,然后从其他列中无法获得正确的数据 我能行 Select * from properties join (SELECT deal_properties.property_id,

我有一个选择属性的查询,我需要加入它们以获取每个属性的最新活动,其中
活动\u status=3
(已成交)。当我得到这些信息时,我需要找到完成交易的银行(
banks.is_reward=1

问题是数据分布在许多表中,所以当我加入以获取所有结果,然后尝试限制到
max(activity\u date)
时,我需要对结果进行分组,然后从其他列中无法获得正确的数据

我能行

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(活动日期)

来限制这一点。查看您的样本似乎是您需要的

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; 

选项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的提琴:

scaisEdge,它可以让我了解最新的活动,但我提到的问题是,我也需要
bank\u id
,当你做
groupby property\u id
时,它没有获得正确的银行id。您可以在我链接的Fiddle中看到这一点。请使用适当的数据样本和一致的预期结果更新您的问题以获取更多详细信息,您可以将此查询与其他表连接。另请参阅窗口函数:特别是最后一个值1010窗口函数的详细信息。但如果他的“小提琴”是一个指标,那么他使用的是MySQL5.6窗口函数,直到MySQL8.DarbyM出现才可用。我更喜欢效率更高的东西,如果找不到更好的,我会接受的。。我只是还没把它擦完。。完成后我将更新。查看选项2。。。这看起来就是你想要的。谢谢,我的实际用例有点复杂,所以我需要稍微调整一下,但这让我达到了我想要的目的。