查询如下,有2张表:
Pagos
-idPago
-idCliente
-fechaEnQuePaga
-fechaVencimiento
Cliente
-idCliente
-nombre
-apellidoPaterno
-apellidoMaterno
-correo
idCliente
是外键。假设表有以下数据:
付款表:
1 | 1 | 2018-02-23 | 2018-03-23
2 | 2 | 2018-02-23 | 2018-05-23
3 | 2 | 2018-02-23 | 2018-06-23
4 | 1 | 2018-04-23 | 2018-07-23
客户表:
1 | Daniel | Sosa | Estrada | [email protected]
2 | Juan | Casas | Sola | [email protected]
我想获取客户数据,然后是他们的付款数据,但是,在最遥远的到期日,期望得到:
1 | Daniel | Sosa | Estrada | 2018-04-23 | 2018-07-23
2 | Juan | Casas | Sola | 2018-02-23 | 2018-06-23
我有一个类似的查询,但没有给我预期的结果:
SELECT
cliente.idcliente,
nombre,
apellidoPaterno,
apellidoMaterno,
fechaEnQuePaga,
fechavencimiento
FROM cliente, pagos
WHERE (cliente.idcliente = pagos.idcliente)
GROUP BY idcliente;
结果:
1 | Daniel | Sosa | Estrada | 2018-02-23 | 2018-03-25
2 | Juan | Casas | Sola | 2018-02-23 | 2018-05-23
我注意到,如果我添加MAX()
它,它会找到最远的到期日,但它没有显示其相应的付款日期:
SELECT
cliente.idcliente,
nombre,
apellidoPaterno,
apellidoMaterno,
fechaEnQuePaga,
MAX(fechavencimiento)
FROM cliente, pagos
WHERE (cliente.idcliente = pagos.idcliente)
GROUP BY idcliente;
结果:
1 | Daniel | Sosa | Estrada | 2018-02-23 | 2018-07-25
2 | Juan | Casas | Sola | 2018-02-23 | 2018-06-23
付款日期与行中的日期不对应。
谢谢您的回答。
窗口函数非常适合这种类型的查询,但 MySQL 没有它们 :(
您可以做的是普通联接(如果客户可能没有付款,则为左联接),但向其添加一个相关子查询,通过以下方式过滤结果
MAX(fechavencimiento)
:fechavencimiento
警告:如果一个客户在表中可以有重复的值pagos
,那么这个查询就有可能为每个客户返回多条记录。您可以执行以下操作:
让我们来看看:
P1
我们获得fechaVencimiento
每个客户端的最大值P2
,我们获得其付款对应于最大值fechaVencimiento
的记录P1
。重要的是,如果您有多个相同客户的记录fechaVencimiento
(在您的示例中似乎没有发生),您应该再添加一个嵌套来“决定”您保留哪一行,只要您期望有一个每个客户单排。JOIN
之间结束,如果您不想忽略那些没有付款的客户,或者如果您想从查询中消除他们,请使用 a。clientes
pagos
LEFT
INNER
这是一个使用纯 SQL 的非常基本的解决方案,我想在MySql中有更好的方法来解决它。
将 INNER JOIN 与 ORDER BY 一起使用
通过这种方式,您将能够获得行的联合,并且您将能够按照您指定的顺序(ASC(升序),DESC(降序))过滤所需的字段
类似于它的查询是因为当它分组时,它采用组的最后一个值,所以你只需要添加一个 GROUP BY,
如果这对您不起作用,请将 ASC 更改为 DESC 并重试。
您必须小心这一点,如果将其导入具有约束 ONLY_FULL_GROUP_BY 的 mysql,它将显示错误
正如他们提到的那样,这将是这样的内部连接