正如我的问题的标题所说,我试了几个小时来弄清楚哪个MySQL查询可能会为每个table1 ID(GROUP BY ´ID´
)返回一个结果,同时选择日期的最大值table2,考虑到这个日期有时可以为null。
我使用LEFT JOIN
和HAVING
尝试使用子查询,但似乎没有任何结果返回一致的结果:我测试的最近查询在大多数情况下会返回最大日期但不会在所有这些中。
查询:
SELECT COUNT(DISTINCT(C.`ClauQuadern`)) AS files,C.`ID`,C.`Data`,C.`IDFactura`,C.`DataFactura`,C.`Cognoms` AS nom,SUM(C.`Grams`) AS pes_total,SUM(C.`Quantitat`) AS nq,C.`Client`,C.`Missatge`,C.`PerPreparar`,Q.`PerReservar`,Q.`DataImpressio`
FROM `Comandes` C
INNER JOIN `Quaderns` Q ON C.`ClauQuadern`=Q.`Clau`
LEFT JOIN
(
SELECT `Clau`, MAX(`DataImpressio`) AS max_data
FROM `Quaderns`
GROUP BY `Clau`
) X ON Q.`Clau`=X.`Clau` AND Q.`DataImpressio`=X.max_data
WHERE
(
(Q.`DataImpressio` IS NOT NULL AND C.`DataAnulacio` IS NULL AND
(
(
(C.`Modalitat`='T' OR C.`Modalitat`='TA' OR C.`Modalitat`='U' OR C.`Modalitat`='M')
AND C.`Gestio`<=1
)
OR
(
(C.`Modalitat`='R' OR C.`Modalitat`='RA' OR C.`Modalitat`='D')
AND C.`Gestio`<=0
)
)
)
OR Q.`DataImpressio` IS NULL
)
GROUP BY C.`ID`
ORDER BY C.`PerPreparar` DESC, Q.`DataImpressio` DESC, C.`ID` DESC
LIMIT 0, 25
表Comandes
CREATE TABLE `Comandes` (
`Clau` int(11) NOT NULL auto_increment,
`ID` int(11) NOT NULL,
`Data` datetime NOT NULL,
`IDFactura` int(11) default NULL,
`DataFactura` datetime default NULL,
`Client` int(11) NOT NULL,
`ClauQuadern` int(5) NOT NULL,
`Quantitat` int(11) NOT NULL,
`Grams` int(5) NOT NULL,
`Modalitat` varchar(2) NOT NULL,
`Gestio` smallint(2) NOT NULL default '-1',
`DataAnulacio` datetime default NULL,
`Cognoms` varchar(100) NOT NULL,
`Missatge` text,
`PerPreparar` tinyint(1) NOT NULL default '0',
PRIMARY KEY (`Clau`),
KEY `Client` (`Client`),
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1
表Quaderns
CREATE TABLE `Quaderns` (
`Clau` int(5) NOT NULL auto_increment,
`PerReservar` tinyint(1) NOT NULL default '0',
`DataImpressio` datetime default NULL,
`Codi` char(6) NOT NULL,
PRIMARY KEY (`Codi`),
UNIQUE KEY `Clau` (`Clau`),
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1
其他注意事项:
Comandes
中,有多个行具有相同的ID
,每个行都引用表Quaderns
中的一条记录。DataImpressio
中的Quaderns
可以为null。输出:(已修改)
files ID Data IDFactura DataFactura Cognoms pes_total nq Client Missatge PerPreparar PerReservar DataImpressio
4 3488 October, 20 2015 15:55:28 (null) (null) De Mesa 1710 4 2226 (null) true false (null) <- shouldn't be null!
3 3476 October, 15 2015 00:10:29 (null) (null) REVERTER ROIG 970 3 1616 (null) true false (null) <- shouldn't be null!
1 3480 October, 16 2015 10:44:00 (null) (null) del valle garcia 310 1 534 (null) false false October, 23 2015 00:00:00
3 3485 October, 18 2015 11:42:32 (null) (null) Palmero 1225 3 919 (null) false false (null) <- shouldn't be null!
1 3484 October, 17 2015 23:44:20 1715 October, 20 2015 14:25:51 Clausell García 250 2 2224 (null) false false (null)
5 3483 October, 17 2015 11:45:33 1713 October, 18 2015 16:29:43 ( a la atención... 1540 5 334 (null) false false (null) <- shouldn't be null!
1 3481 October, 17 2015 07:21:14 (null) (null) Calm Codina 125 1 2223 (null) false false (null)
1 3479 October, 15 2015 22:03:44 1712 October, 16 2015 12:59:26 Seoane Prieto 380 1 1853 He visto... false false (null)
2 3478 October, 15 2015 20:11:36 (null) (null) Serrano 525 2 858 (null) false false (null) <- shouldn't be null!
1 3477 October, 15 2015 13:15:11 (null) (null) Aguado Díaz 365 1 1530 (null) false false (null) <- shouldn't be null!
2 3475 October, 14 2015 22:27:21 (null) (null) lopez gil 335 2 2211 (null) false false (null) <- shouldn't be null!
观察:(已编辑)
ORDER BY
子句显示(ORDER BY C.´PerPreparar´ DESC, Q.´DataImpressio´ DESC, C.´ID´ DESC
)时,结果首先排序为true
为PerPreparar
(前2个结果),第二个排序为false
´DataImpressio´ DESC
(最后9个结果)。´ID´ DESC
进行了子排序,并按ID
进行了子排序。结论:(已编辑)
一切都会好的,但事实证明,DataImpressio
3488,3476,3480,3485,3483,3478,3477和3475的行应该具有非空值GROUP BY
。有些事情表明主查询中的DataImpressio
子句在分组之前没有考虑Quaderns
应始终是子集的最大值的条件。
其他注意事项:(已添加)
表DataImpressio
中包含Quaderns.Codi: A0044 G0013 P0001
Quaderns.Clau: 405 406 162
Quaderns.DataImpressio: 2015-10-19 00:00:00 2015-10-23 00:00:00 2015-10-22 00:00:00
非空值的记录:
Comandes.ID Comandes.ClauQuadern Quaderns.DataImpressio
3488 contains 405 2015-10-19 00:00:00 (ERROR: outputs NULL instead)
3476 contains 405 & 406 2015-10-23 00:00:00 (ERROR: outputs NULL instead)
3480 contains 406 2015-10-23 00:00:00 (CORRECT: probably because for this Comandes.ID there is only 1 row)
3485 contains 405 2015-10-19 00:00:00 (ERROR: outputs NULL instead)
3483 contains 405 2015-10-19 00:00:00 (ERROR: outputs NULL instead)
3478 contains 406 2015-10-23 00:00:00 (ERROR: outputs NULL instead)
3477 contains 405 2015-10-19 00:00:00 (ERROR: outputs NULL instead)
3475 contains 162 2015-10-22 00:00:00 (ERROR: outputs NULL instead)
简化的结果表:
Comandes
我注意到更改表´Quaderns´.´DataImpressio´
中的插入顺序,如果首先插入引用非空GROUP BY
的行,则查询会识别非空值。因此,这指出条款ID
仅考虑每个´Quaderns´.´DataImpressio´
的第一个插入行,而不是获取(define (reduce f id lis)
(if (null? lis) id
(f (car lis) (reduce f id (cdr lis)))))
最大的行。
我已经在stackoverflow中搜索了类似的问题,例如this one或this one,但解决方案的所有方法在我的情况下都得到了相同的结果。要么我犯了一个我无法看到的小愚蠢错误,要么我的案例需要一些额外的解决方法。
任何想法都会受到赞赏。
编辑:为了帮助您,我创建了一个SQLfiddle,您可以在其中看到输出(请等待几秒钟直到加载)。