2009-08-23 6 views
0

私は本当にこの問題を解決するのに問題があります。MySQLの混乱でグループ化する

私はテーブルを持っている「コメント」:

cmt_id (primary key, auto incr), thread_id, cmt_text 

を、私はそれにこれらのレコードを持っている:

cmt_id thread_id  cmt_txt 
5002  1251035762511 Alright, I second this. 
5003  1251036148894 Yet another comment. 
5001  1251035762511 I am starting a thread on this. 

私は今、各スレッドに最小cmt_idレコードを取得したいです。だから、私は、集計クエリをこのように行った:

SELECT cmt_id, thread_id, cmt_text, MIN(cmt_id) FROM comments 
GROUP BY thread_id; 

は、しかし、私はこれで終わる:thread_id「1251035762511」とのスレッドの

cmt_id thread_id cmt_text     MIN(cmt_id) 
5002 1251035762511 Alright, I second this.  5001 
5003 1251036148894 Yet another comment.  5003 

、私はいつもcmt_id 5002とのコメントを取得しています私は新しいレコードを挿入しようとしましたが、cmt_id 5002は常にMINとして表示され、レコードはcmt_id 5001となりません。

答えて

1

SELECT 
    cmt_id, 
    thread_id, 
    cmt_text 
FROM comments 
WHERE cmt_id IN (
     SELECT 
      MIN(cmt_id) 
     FROM comments 
     GROUP BY thread_id); 

これはあなたのクエリで、それは分cmt_idランダムな1つ(またはで行ないままに行をマージする方法SQL作品であり、最後の1つですが、私はそれを信じません)。上のクエリでは、最初にすべてのminidを見つけて、それぞれのminidを取得します。

0

これは単なる誤植かもしれませんが、実際に入力したMIN(cmt_id)はMAX(cmt_id)ではありません。

SELECT cmt_id, thread_id, cmt_text, MIN(cmt_id) FROM comments 
GROUP BY thread_id; 

は、私はあなただけで、その後

SELECT MAX(cmt_id), thread_id FROM comments GROUP BY thread_id 

が十分であろう最大コメントIDをしたい場合は、お使いのモニタによってrubber duckを入れて

に話をする必要があるかもしれないと思います。追加のフィールドが必要な場合は、ここで他の答えに応じてサブクエリを使用する必要があります。

あなたがのラインで何かを持っている必要が
0
SELECT * 
FROM comments 
    INNER JOIN (
     SELECT cmt_id = MIN(cmt_id), thread_id 
     FROM comments 
     GROUP BY thread_id 
    ) cmin ON cmin.cmt_id = comments.cmt_id 
1

MySQLは、あなたがそれを行うことができますなぜ私にはわからないが、通常はSQLで次のクエリが有効でない

SELECT cmt_id, thread_id, cmt_text, MIN(cmt_id) FROM comments 
GROUP BY thread_id; 

それは

がない場合は、SELECT列を指定できないようにする必要があり
  1. GROUP BY
  2. 集約関数(例えばMINMAXCOUNTSUM ...)

あなたのケースでは、私はこの選択

SELECT cmt_id, thread_id, cmt_text FROM comments INNER JOIN (
    SELECT MAX(cmt_id) AS cmt_id FROM comments 
    GROUP BY thread_id 
) a ON a.cmt_id = comments.cmt_id 
を使用します