mysql如何基于最新关系数据进行查询

5cg8jx4n  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(347)

我有两张table
公司
公司搬迁历史
关系是公司有很多搬迁历史
样本数据表公司

示例数据表company\u remocation\u histories

示例数据库->https://www.dropbox.com/s/e8uvuc9vvgacz0q/test.sql?dl=0
我想查询最近搬迁到某个地方的所有公司,例如到fr。只计算最后一个地点。
预期的数据是只有公司id 1(mib)才会列出。
公司id 3(skd)将被排除在外,因为尽管他们之前已经搬迁到fr,但最后一次搬迁是sg。
下面是我对sql查询的看法,它还没有工作(错误的结果)。如何解决这个问题?多谢堆栈溢出!

SELECT * 
FROM   `companies` 
WHERE  EXISTS (SELECT * 
               FROM   `company_relocation_histories` 
               WHERE  `companies`.`id` = 
`company_relocation_histories`.`company_id` 
                      AND `relocation_location` = 'FR' 
                      AND `id` = (SELECT Max(id) 
                                  FROM   `company_relocation_histories` AS `sub` 
                                  WHERE  sub.relocation_location = 
       company_relocation_histories.relocation_location))
k2fxgqgv

k2fxgqgv1#

检查此查询。内部查询组重新定位历史以获取至少有两个或多个重新定位的公司id。

select * from companies 
where id in (
  select company_id 
  from company_relocation_histories 
  group by company_id
  having count(*) = 2
);

编辑:根据op的评论

SELECT * 
FROM   companies 
WHERE  id IN (SELECT company_id 
              FROM   (SELECT company_id, 
                             Lead(relocation_location) OVER(ORDER BY id) x, 
                             Count(*) OVER (partition BY company_id) cnt 
                      FROM   company_relocation_histories) t 
              WHERE  x = 'FR' 
                     AND cnt = 2 
              GROUP  BY company_id);
57hvy0tb

57hvy0tb2#

您可以使用max(id)和count>1的子查询

SELECT * 
FROM   `companies`  c
INNER JOIN company_relocation_histories h on c.id = h.company_id
INNER JOIN 
(
    SELECT company_id, Max(id)  max_id
    FROM   `company_relocation_histories` AS `sub` 
    group by company_id 
    having count(*) >1
) t on t.company_id = c.id 
        and t.max_id  = h.id 
          and h.relocation_location  ='FR'

这样你就有了所有的公司与多个地点和相关的最后一个地点

相关问题