从Group By获取最后一个元素

时间:2012-07-30 10:49:16

标签: mysql group-by

我有这个问题......

    $sQuery = "
        SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns))."
        FROM   dominios left join datas on dominios.id_dominio=datas.id_dominio
left join dnss on dominios.id_dominio=dnss.id_dominio
left join entidades_gestoras on dominios.id_dominio=entidades_gestoras.id_dominio
left join estados on dominios.id_dominio=estados.id_dominio
left join ips on dominios.id_dominio=ips.id_dominio
left join quantidade_dnss on dominios.id_dominio=quantidade_dnss.id_dominio
left join responsaveis_tecnicos on dominios.id_dominio=responsaveis_tecnicos.id_dominio
left join titulares on dominios.id_dominio=titulares.id_dominio 
        WHERE dominios.estado not like 2 and dominios.estado not like 0 AND data_expiracao > '".date("Ymd")."' $sWhere $where 
        GROUP BY dominio 
        $sOrder
        $sLimit
        ";

它将我需要的结果归还给我...... 但是Group By,它向我展示了数据库中出现的第一个结果,我需要最后一个......

我该怎么做? :s

被修改 这是最终查询,没有那些变量

  SELECT SQL_CALC_FOUND_ROWS `datas`.`data_insercao`, `datas`.`data_expiracao`, `datas`.`data_registo`, 
`dominios`.`dominio`, 
`titulares`.`nome`, `titulares`.`morada`, `titulares`.`email`, `titulares`.`localidade`, `titulares`.`cod_postal`, 
`entidades_gestoras`.`nome`, `entidades_gestoras`.`email`, 
`responsaveis_tecnicos`.`nome`, `responsaveis_tecnicos`.`email`, 
`ips`.`ip`, `dominios`.`id_dominio` FROM dominios left join datas on dominios.id_dominio=datas.id_dominio 
left join dnss on dominios.id_dominio=dnss.id_dominio 
left join entidades_gestoras on dominios.id_dominio=entidades_gestoras.id_dominio 
left join estados on dominios.id_dominio=estados.id_dominio 
left join ips on dominios.id_dominio=ips.id_dominio 
left join quantidade_dnss on dominios.id_dominio=quantidade_dnss.id_dominio 
left join responsaveis_tecnicos on dominios.id_dominio=responsaveis_tecnicos.id_dominio left join titulares on dominios.id_dominio=titulares.id_dominio WHERE dominios.estado not like 2 and dominios.estado not like 0 AND data_expiracao > '20120730' GROUP BY dominio ORDER BY `datas`.`data_insercao` asc LIMIT 0, 10

2 个答案:

答案 0 :(得分:0)

默认情况下,MySQL按升序对记录进行排序,首先获取最后一条记录,然后对DESCNDING ORDER中的记录进行排序:

$sOrder DESC

答案 1 :(得分:0)

一般注意事项

我不确定aColumns中的columsn是什么,或者dominio列来自哪个表。当您使用GROUP BY对多个行进行分组时,您为结果选择的列应该对该组的所有行具有相同的值(即,在功能上相关),或者应该是某些aggregate function合并组中所有行的值。

一些SQL方言强制执行此操作。 MySQL没有,但如果您选择一个在组内具有不同值的非聚合列,则无法保证实际返回给您的值。它可能来自组内的任何行。所以没有办法获得这些行的“最后”,因为没有任何固有的顺序。在简单的情况下,您可以使用MINMAX来选择所需的值。在更复杂的情况下,您很可能必须使用子查询从组内进行选择。

例如,this answer根据按升序排序的{{1}计算每个Name(对应于您的dominio分组列)Action的最后一个值}}。或者更确切地说,第一个值使用降序排列,这是相同的。

您的申请

如下面的评论表明您希望Time中每个id_dominio的最大dominio,我建议如下:

dominios

因此,将有一个子查询来计算每个SELECT … FROM (SELECT MAX(id_dominio) AS id_dominio FROM dominios GROUP BY dominio WHERE estado <> 2 AND estado <> 0 ) domIds LEFT JOIN datas ON domIds.id_dominio=datas.id_dominio … 组的最大id_dominio,并且所有后续联接都可以使用该子查询中的ID而不是完整的dominio表。如果您还需要dominio表中的其他列,则可能必须再次在连接中包含该列,以便您可以从子查询中选择了ID的那些row3中获取所有值。