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は、データベースに表示される最初の結果を示し、最後の結果が必要でした...

これどうやってするの?: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
4

2 に答える 2

0

一般的な考慮事項

にある列、またはその列がaColumnsどのテーブルからのものかわかりません。dominioを使用して多数の行をグループ化する場合GROUP BY、結果のために選択する列は、グループのすべての行で同じ値を持つ (つまり、機能的に依存する) か、すべての行の値を組み合わせた集計関数である必要があります。グループ。

一部の SQL ダイアレクトはこれを強制します。MySQL はそうではありませんが、グループ内で異なる値を持つ集計されていない列を選択した場合、実際にどの値が返されるかについての保証はありません。グループ内の任意の行から取得される可能性があります。したがって、固有の順序がないため、これらの行の「最後」を取得する方法はありません。単純なケースでは、MINまたはを使用MAXして必要な値を選択できます。より複雑なケースでは、ほとんどの場合、サブクエリを使用してグループ内からの選択を行う必要があります。

たとえば、この回答は、昇順による順序付けに基づいて、すべてのName(グループ化列に対応するdominio) の最後の値を計算します。または、同じ降順を使用した最初の値です。ActionTime

あなたの申請

以下のコメントは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したがって、各グループの最大値を計算するためのサブクエリが 1 つdominioあり、後続のすべての結合では、テーブル全体ではなく、そのサブクエリからの ID を使用できdominioます。テーブルの他の列も必要な場合dominioは、サブクエリで選択した ID を持つ row3 からすべての値を取得できるように、結合に再度含める必要がある場合があります。

于 2012-07-30T11:01:16.593 に答える