2012-05-11 10 views
0

私はコーディングしていますが、これは他のものとは少し異なります。この場合、フィードセクションにユーザーごとにステータス表示が1つしかありません。ユーザ別にグループ化し、MYSQLの最新のものを表示しない

だから私は、残念ながら、私はこの作業を取得するように見えることができないユーザーID でトップだけでなく、グループでの最新のものと日付で状況をソートする必要がある....

これは私の現在のクエリです:

SELECT * 
FROM status 
WHERE userID != "83" #This is just so my statuses don't show 
GROUP BY userID 
ORDER BY addedDate DESC 
LIMIT 10 

私はORDER BY働いていないが、することにより、グループので、最初のステータスを参照してください代わりに、最新のステータス結果を見ることを期待し、ユーザーごとに1つだけ。

ありがとうございます。

答えて

2

Robin's answerへのコメントで述べたように、MySQLは、それは常に、各グループからの最新の状態を返すことを保証するものではありませんので、そのアプローチは信頼できないです。代わりに、最新のステータス(addedDateに基づいて)を選択するサブクエリでテーブルを結合する必要があります。

SELECT * 
FROM  status 
    NATURAL JOIN (
    SELECT userID, MAX(addedDate) as addedDate 
    FROM  status 
    GROUP BY userID 
) AS mostRecent 
ORDER BY addedDate DESC 
LIMIT 10 

ユーザーが同じaddedDateで複数のステータスの更新を持っている場合(ロビンのクエリが不確定1を返すのに対し)、サーバはそれらのすべてを返すことに注意してください。そのような状況を管理する必要がある場合は、そのような状況の更新をどのように選択するかを決定する方法を定義する必要があります。

+0

ありがとうございました。 –

1
SELECT * 
FROM ( SELECT * 
     FROM status 
     WHERE userID != "83" 
     ORDER BY addedDate DESC) AS h 
GROUP BY userID 
ORDER BY addedDate DESC 
LIMIT 10 

GROUP BY'ingの前にORDER BYする必要があります。

Example 1
Example 2

+1

[MySQLマニュアル](http://dev.mysql.com/doc/ja/group-by-hidden-columns.html)から: "*サーバーは各グループから任意の値を自由に選択できますそれらが同じでない限り、選択された値は不確定*です。 – eggyal

+0

私はこの議論を無限の時間にしてきました。このソリューションは信頼性があります。これに関して私が以前の鉱山の答えを調べることができるかどうかを見てみましょう。 –

+0

これはうまくいきましたが、完全ではないが、日付順に間違った位置に1つの投稿が表示されています。それはユーザーIDによるグループのためでしょうか? –

1
SELECT userID, max(addedDate) 
FROM status 
WHERE userID != "83" #This is just so my statuses don't show 
GROUP BY userID 
+0

私はすでにそれを試して、それは動作しませんでした。 –

関連する問題