为每个外键选择行的最大数据

时间:2017-05-30 13:18:49

标签: mysql sql subquery

我有一个MySQL数据库,有一些表格。

使用此查询:

SELECT anagrafe.MARCHIO, anagrafe.BOLO, anagrafe.NUMERO_AZIENDALE, visite.COLLOCAZIONE, visite.DATA_PREVISTA_PARTO, visite.DATA_VISITA  
FROM anagrafe LEFT JOIN visite USING(NUMERO_AZIENDALE) 
WHERE visite.STATO_VISITA ='Gravida' AND visite.DATA_PREVISTA_PARTO > '2017-04-01'

我明白了: enter image description here 但我只需要每个NUMERO_AZIENDALE都有max(DATA_VISITA)的行(见红色)

NUMERO_AZIENDALE是anagrafe(表格)的外键和visite(表格)的主键的一部分。 主键由NUMERO_AZIENDALE和ID(此处未显示)

组成

我尝试使用GROUP BY NUMERO_AZIENDALE但是visite.COLLOCAZIONE没有正确显示,也就是说,查询显示了我不需要的行的值

3 个答案:

答案 0 :(得分:2)

你可以在NUMERO_AZIENDALE

的基础上使用一个基于NUMERO_AZIENDALE和DATA_VISITA组的元组的in子句
  SELECT  anagrafe.MARCHIO, anagrafe.BOLO, anagrafe.NUMERO_AZIENDALE,
           visite.COLLOCAZIONE, visite.DATA_PREVISTA_PARTO, visite.DATA_VISITA 
  FROM anagrafe LEFT JOIN visite USING(NUMERO_AZIENDALE
  WHERE visite.STATO_VISITA ='Gravida' AND visite.DATA_PREVISTA_PARTO > '2017-04-01'
  AND (anagrafe.NUMERO_AZIENDALE, visite.DATA_VISITA ) IN 
  ( 
  SELECT  anagrafe.NUMERO_AZIENDALE, max(visite.DATA_VISITA)  
  FROM anagrafe LEFT JOIN visite USING(NUMERO_AZIENDALE) 
  WHERE visite.STATO_VISITA ='Gravida' 
    AND visite.DATA_PREVISTA_PARTO > '2017-04-01'
    GROUP BY anagrafe.NUMERO_AZIENDALE
    ) 

答案 1 :(得分:1)

或者您可以使用相关的子查询:

{% schema %}

答案 2 :(得分:1)

我认为你不需要重复JOIN。这应该是一种更简单的方法来做你想做的事情:

SELECT a.MARCHIO, a.BOLO, a.NUMERO_AZIENDALE,
       v.COLLOCAZIONE, v.DATA_PREVISTA_PARTO, v.DATA_VISITA  
FROM anagrafe a JOIN
     visite v
     USING (NUMERO_AZIENDALE) 
WHERE v.STATO_VISITA ='Gravida' AND
      v.DATA_PREVISTA_PARTO > '2017-04-01' AND
      v.DATA_VISITA = (SELECT MAX(v2.DATA_VISITA)
                       FROM visite v2
                       WHERE v2.NUMERO_AZIENDALE = v.NUMERO_AZIENDALE AND
                             v2.STATO_VISITA = v.STATO_VISITA AND
                             v2.DATA_PREVISTA_PARTO > '2017-04-01'
                      );

注意:

  • WHERE子句会将LEFT JOIN变为INNER JOIN,因此请将其称为LEFT JOIN,从而产生误导。
  • 表别名使查询更易于编写和阅读。
  • 这假设visite是您想要的最大值。
  • 您可以使用IN和元组或使用JOINFROM子句中的聚合查询来说明此逻辑。关键是不需要额外的JOIN