2009-07-25 15 views
0

私は現在、データベースからいくつかのデータを選択するためにPHP/MySQLを使用しています。私の現在のSELECT文は次のとおりです。MySQL Selectステートメント - GROUP BY /ユニーク

mysql_query("SELECT * FROM tblpm WHERE receiver_id ='$usrID' GROUP BY 
thread_id ORDER BY unique_id DESC") or die(mysql_error()); 

同じ「スレッドID」を持っているいくつかの列が一つだけ「スレッドID」列が選択されるように、このように、私は、GROUP BYを使用しています、があります。グループ化ですべてうまく動作しますが、最初の「スレッドID」列が選択されていますが、最新のものではありません(これが私が望むものです)。

thread_id unique_id 
    222   1 
    222   2 
    222   3 
    222   4 

私はGROUP BYを行うと、私はそれはユニークなID 4(最も新しく作成した列)に1を取得したいと思います:

例えば、同じなthread_idと4列すべてがあります一意のID 1(作成された最も古い列)ではありません。

私のSELECTステートメントでこれを達成する方法に関するアイデアはありますか?ありがとう。

+0

あなたのクエリは、SQLインジェクションの脆弱性を有することができます()。返信用 –

+0

ありがとう: $データ=するmysql_query( "SELECT tblpm.thread_id、tblpm.receiver_id、tblpm.title、MAX(tblpm.content)、tblpm.date_sent、tblpmを:ここで は私が現在使用しているものです.sender_id UNIQUE_IDとして、tblpm.read_pref、MAX(tblpm.id)、FIRST_NAME AS tblusers.usrFirst、tblpm LEFT OUTER FROM LAST_NAME AS tblusers.usrLastはtblpm.sender_id = tblusers.usrID WHERE receiver_id = ON tblusers をJOIN '$ usrID' GROUP BY thread_id ORDER BY unique_id DESC ") またはdie(mysql_error()); –

+0

しかし、最新の「コンテンツ」列を表示しようとすると、最新のものではなく最初の「コンテンツ」フィールドが表示されます。ご覧のとおり、私はMAX(tblpm.content)を呼び出そうとしていますが、それは仕事を完了させるようには見えません。これを行う方法に関するアイデア? –

答えて

3
SELECT thread_id, MAX(unique_id) 
FROM tblpm 
GROUP by thread_id 

ので:

mysql_query(<<<END 
SELECT thread_id, MAX(unique_id) 
FROM tblpm 
WHERE receiver_id ='$usrID' 
GROUP by thread_id 
END 
) or die(mysql_error()); 

そしてもちろん、それはブラウザから来ている場合は、USRID $をエスケープしてください。あなたのクエリをパラメータまたはmysqli_real_escape_stringを使用していないので、

0
SELECT thread_id, max(unique_id) 
FROM tblpm 
WHERE receiver_id = '$usrID' 
GROUP BY thread_id; 
0
SELECT DISTINCT thread_id, unique_id 
FROM tblpm 
WHERE receiver_id = '$usrID' 
GROUP BY thread_id 
ORDER BY unique_id DESC;