2016-04-19 16 views
2

データベースから最新の証明書を取得しようとしています。私は最新のものを見たいだけで、他のもの全てを見たくないので、私はグループを使っています。そして、メインテーブルから一意のIDで注文します。mysqlクエリーでgroup byとorder byを正しく使用する

これでグループがなければ、完全に動作します。私は最後に証明書がアップロードされたことを確認してから、次にすべての証明書を確認します。

私がグループを追加するとすぐに、これまでにアップロードされた最初の証明書が何年も前から無意味であることがわかります。

私は他のテーブルの他の多くの情報を描画しているので、私のクエリはかなり大きいです。

ここは私の質問です。

SELECT 
     usercert.*, 
     cert.*, 
     certCat.certCatName, 
     certTask.certTaskName , 
     certStatus.certStatusName 
    FROM 
     `usercert` 
    INNER JOIN 
     cert 
    ON 
     cert.idcert = usercert.idcert 
    INNER JOIN 
     certCat 
    ON 
     certCat.idcertCat = cert.idcertCat 
    INNER JOIN 
     certTask 
    ON 
     certTask.idcertTask = usercert.idcertTask 
    INNER JOIN 
     certStatus 
    ON 
     certStatus.idcertStatus = usercert.idcertStatus 
    WHERE 
     usercert.iduser=%s 
    GROUP BY 
     usercert.idcert 
    ORDER BY 
     usercert.usercertEnd DESC 
+0

日付の 'MAX'キーワードを' LIMIT'キーワードと組み合わせて試しましたか? –

+0

最後の証明書だけが必要な場合は、でグループを作成する必要はありません。既に持っているクエリでLIMIT 1を実行するだけで、必要な行のみが返されます。 –

答えて

2
SELECT 
    usercert.*, 
    cert.*, 
    certCat.certCatName, 
    certTask.certTaskName , 
    certStatus.certStatusName 
FROM 
    `usercert` 
INNER JOIN 
    cert 
ON 
    cert.idcert = usercert.idcert 
INNER JOIN 
    certCat 
ON 
    certCat.idcertCat = cert.idcertCat 
INNER JOIN 
    certTask 
ON 
    certTask.idcertTask = usercert.idcertTask 
INNER JOIN 
    certStatus 
ON 
    certStatus.idcertStatus = usercert.idcertSttus 
WHERE 
    usercert.iduser=%s 
ORDER BY 
    usercert.usercertEnd 
DESC limit 0,1 

を、それが最後に挿入を意味降順ですべてのレコードがかかります行が最初に来て、限界0,1はそれが0から始まり、1レコードをフェッチすることを意味しますそれは...

+0

ビッキーは魅力的な作品です。ありがとうございました。このことが最後に何をしているのかを簡単に説明できますか? –

+1

私の答えを更新するだけの秒 –

1

あなたはMAX()を使用することができ、次のいずれか

SELECT ... FROM ... WHERE ... ORDER BY MAX(usercert.usercertEnd) 

それともLIMIT:このクエリで

SELECT ... FROM ... WHERE ... ORDER BY usercert.usercertEnd DESC LIMIT 1 
関連する問題