2012-03-13 9 views
0

こんにちは私はSQLクエリに問題があります。最新のコメントをもとにした製品を表示するようにテーブルを出力したい場合は、出力が製品ID 78、製品ID 79、製品ID 81、製品ID 78、製品ID 81 、私は出力が製品ID 78、製品ID 79、製品ID 81になりたいです。基本的には、製品に関する最新のコメント活動を示すページを作成しようとしています。sql query complex発行による問題

SELECT comments.products_products_id, products.name, products.minilocation, products.users_user_id, 
comments.comment, comment_id, comments.time_stamp, users.username, users.miniavatar FROM products 
INNER JOIN comments ON comments.products_products_id = products.products_id INNER JOIN users ON users.user_id = comments.products_users_user_id 
ORDER BY comments.time_stamp DESC 
+0

comments.products_products_idは実際のコメントですか.products_idですか? –

+0

最新のコメントで注文するには、アイテムのすべてのコメントが一緒になっていることを確認してください。 –

+0

すべてのIDは正しいです。うん、基本的にちょうどちょうどちょうどその上に最新のコメント活動で製品を置いてほしい。製品IDに重複がありません。 – Anonymous

答えて

2

あなただけのproduct_idあたりの最近のコメントをしたい場合、またはあなたがすべてのコメントをしたい場合は異なりますが、最新のコメント付きの製品が最初にある場合だけのproduct_idによって並べ替え。


あなたはproduct_idsが最新コメントの順にソートされたproduct_idによってグループ化すべてコメント、(すなわちしたい場合は、最新のタイムスタンプ順に製品を提案する方法を見るためにある(3,1,2 ):

product_id comment_timestamp 
    3    2012-03-13 
    3    2012-03-09 
    3    2012-03-01 
    1    2012-03-12 
    1    2012-01-01 
    2    2012-03-11 

は次にここにあなたがそれを行うことができる方法だ - 、製品ごとの最新のタイムスタンプを見つけるあなたのメインクエリにそれを登録しようと、それによって順:

SELECT comments.products_products_id, products.name, 
     products.minilocation, products.users_user_id, 
     comments.comment, comment_id, comments.time_stamp, 
     users.username, users.miniavatar 
FROM products 
-- NEW JOIN: 
INNER JOIN (SELECT product_id, MAX(time_stamp) as latest 
      FROM comments 
      GROUP BY product_id) latest 
     ON latest.product_id = products.product_id 
-- as before. 
INNER JOIN comments ON comments.products_products_id = products.products_id 
INNER JOIN users ON users.user_id = comments.products_users_user_id 
-- NEW SORT: 
ORDER BY latest.latest DESC, comments.time_stamp DESC 

新しいテーブルが結合されました。最新の)製品IDごとのタイムスタンプ。 これは単一の製品ID内で同じになります。

我々ソートすることにより、この最初の(最新コメントのタイムスタンプでソートする)、および各製品ID内の個々のコメントのタイムスタンプによってその後、ソート。


あなたがたproduct_idあたりの最も最近のコメントをしたい場合、すなわち

product_id comment_timestamp 
    3    2012-03-13 
    1    2012-03-12 
    2    2012-03-11 

次に使用:

SELECT comments.products_products_id, products.name, 
     products.minilocation, products.users_user_id, 
     comments.comment, comment_id, comments.time_stamp, 
     users.username, users.miniavatar 
FROM comments 
-- NEW SELF-JOIN 
LEFT JOIN comments c2 ON comments.products_products_id = c2.products_products_id 
        AND comments.time_stamp < c2.time_stamp 
INNER JOIN products ON comments.products_products_id = products.products_id 
INNER JOIN users ON users.user_id = comments.products_users_user_id 
-- new condition 
WHERE c2.time_stamp IS NULL 
ORDER BY comments.time_stamp DESC 

をクエリのこの種は、 "グループあたり最大n個" と呼ばれ、あなたされます基本的にあなた自身のCOMMENTSテーブルをの各product_idに登録してください。また、あるテーブルのタイムスタンプが他のテーブルよりも少なくなるように、それを結合します。 WHERE条件は、そのproduct_id、すなわち最新のコメントに対するタイムスタンプがより大きくならないように行を選択する。

+0

私はそれがうまくいったと思う。私がcomments.comment_idに変更したあいまいでないcomment_id以外。私のもっとも複雑なクエリです。ありがとうございました。 – Anonymous