我有这个查询。。。
$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
一般注意事项
我不确定aColumns
中有哪些列,或者dominio
列来自哪个表。当您使用GROUP BY
对多行进行分组时,为结果选择的列对于组中的所有行都应该具有相同的值(即函数依赖性),或者应该是组合组中所有行的值的某种聚合函数。
某些SQL方言强制执行了这一点。MySQL没有,但如果您选择一个在组中具有不同值的未聚合列,则无法保证实际会返回什么值。它可能来自组中的任何一行。因此,无法获得这些行中的"最后一行",因为没有任何固有的顺序。在简单的情况下,您可以使用MIN
或MAX
来选择所需的值。在更复杂的情况下,您很可能不得不使用子查询来从组中进行选择。
例如,此答案根据升序Time
为每个Name
(对应于您的dominio
分组列)计算Action
的最后一个值。或者更确切地说是使用降序的第一个值,这是相同的。
您的应用程序
由于您在下面的评论表明,您希望dominios
中的每个dominio
都有最大的id_dominio
,我建议如下:
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
…
因此,将有一个子查询来计算每个dominio
组的最大id_dominio
,并且所有后续联接都可以使用该子查询中的ID,而不是完整的dominio
表。如果您还需要dominio
表中的其他列,您可能需要再次将其包含在联接中,这样您就可以从那些在子查询中选择了ID的行3中获取所有值。
默认情况下,MySQL按升序对记录进行排序,要先获取最后一条记录,需要对DESCNDING ORDER
:中的记录进行排序
$sOrder DESC