2012-07-30 80 views
0

我有這個疑問...獲得最後一個元素,從集團到

$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,它告訴我,出現在第一個結果數據庫,我需要最後的...

我該怎麼做? :■

編輯 這是最終的查詢,如果沒有這些變量

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 

回答

0

一般考慮

我不知道什麼C olumsn你在aColumns,或dominio列是從哪裏來的。當您使用GROUP BY對多個行進行分組時,那麼您爲結果選擇的列應該對該組中的所有行具有相同的值(即,在功能上依賴),或者應該是將所有行的值組合到一起羣組。

一些SQL方言強制執行此操作。 MySQL不會,但是如果您選擇了一個在組中具有不同值的未聚合列,則不能保證實際返回給您的值。它可能來自組內的任何一行。所以沒有辦法獲得這些行的「最後」,因爲沒有任何固有的順序。在簡單情況下,您可以使用MINMAX來選擇所需的值。在更復雜的情況下,您很可能必須使用子查詢從組中進行選擇。

例如,this answer計算每一個Name(相當於你dominio分組列)以排序按升序TimeAction最後一個值。或者更確切地說,使用降序排列的第一個值是相同的。

您的應用程序

如下您的評論表示您希望在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 
… 

所以會有一個子查詢來計算最大id_dominio對於每個dominio組,所有後續聯接都可以使用該子查詢中的ID而不是完整的dominio表。如果您還需要dominio表中的其他列,則可能需要再次將它包含在聯接中,以便您可以從在子查詢中選擇其ID的那些row3中獲取所有值。

+0

我該如何做子查詢?我試過「擁有dominios。id_dominio =(SELECT id_dominio FROM dominios ORDER BY id_dominio DESC)」,但沒有工作.. – nunong21 2012-07-30 11:08:02

+0

@ nunong21:我更新了我的答案基於您的評論的幫助男人 – MvG 2012-07-30 11:49:40

+0

好吧,我想它,現在,感謝: d – nunong21 2012-07-30 11:57:13

0

通過MySQL默認進行升序排序記錄,拿到最後一個記錄,首先您需要記錄在DESCNDING ORDER排序:

$sOrder DESC 
+0

它不工作...它命令collums是的,但仍然沒有得到該組的最後一個元素 – nunong21 2012-07-30 10:53:03

+0

真的是在組中的東西... – nunong21 2012-07-30 10:55:21

+0

檢查您的LIMIT條件,它應該從0開始0 LIMIT 0, 10或只是極限10. – Omesh 2012-07-30 11:16:41