我有一个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'
我明白了: 但我只需要每个NUMERO_AZIENDALE都有max(DATA_VISITA)的行(见红色)
NUMERO_AZIENDALE是anagrafe(表格)的外键和visite(表格)的主键的一部分。 主键由NUMERO_AZIENDALE和ID(此处未显示)
组成我尝试使用GROUP BY NUMERO_AZIENDALE但是visite.COLLOCAZIONE没有正确显示,也就是说,查询显示了我不需要的行的值
答案 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
和元组或使用JOIN
对FROM
子句中的聚合查询来说明此逻辑。关键是不需要额外的JOIN
。