MySQL:从table2中选择最大日期,并从table1中按ID分组,其中table2 date可以为null

时间:2015-10-21 23:22:00

标签: mysql datetime null group-by max

正如我的问题的标题所说,我试了几个小时来弄清楚哪个MySQL查询可能会为每个table1 ID(GROUP BY ´ID´)返回一个结果,同时选择日期的最大值table2,考虑到这个日期有时可以为null。 我使用LEFT JOINHAVING尝试使用子查询,但似乎没有任何结果返回一致的结果:我测试的最近查询在大多数情况下会返回最大日期但不会在所有这些中。

查询:

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)时,结果首先排序为truePerPreparar(前2个结果),第二个排序为false ´DataImpressio´ DESC(最后9个结果)。
  • 反过来,这些2和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 onethis one,但解决方案的所有方法在我的情况下都得到了相同的结果。要么我犯了一个我无法看到的小愚蠢错误,要么我的案例需要一些额外的解决方法。

任何想法都会受到赞赏。

编辑:为了帮助您,我创建了一个SQLfiddle,您可以在其中看到输出(请等待几秒钟直到加载)。

0 个答案:

没有答案