2012-03-13 6 views
1

私には、これに関連する多くの同様のスレッドがありますが、私の状況に合ったものは見つかりません。mysqlグループを返すことによってセット

私が探しているのは、私がuser_idでグループ化し、max id set(idは一意の列ではありません)を返すことができるmysql文です。

SELECT * FROM table WHERE url_id IN (3629,4115) group by url_id having max(id); 

問題文が唯一のそのセットのためだけのトップの検索エンジンを出力していることである:

id  url_id submit_date   engine status message 
14738 3629 2009-01-02 18:43:55 0pn 10 NULL 
14738 3629 2009-01-02 18:43:55 Abacho 10 NULL 
14738 3629 2009-01-02 18:43:55 Acoon 10 NULL 
14739 3629 2009-01-02 18:43:55 Alexa 10 NULL 
14739 3629 2009-01-02 18:43:55 Amfibi 10 NULL 
14739 3629 2009-01-02 18:43:55 Burf 10 NULL 
14740 4115 2009-01-02 18:43:55 0pn 10 NULL 
14740 4115 2009-01-02 18:43:55 Abacho 10 NULL 
14740 4115 2009-01-02 18:43:55 Acoon 10 NULL 
14741 4115 2009-01-02 18:43:55 Alexa 10 NULL 
14741 4115 2009-01-02 18:43:55 Amfibi 10 NULL 
14741 4115 2009-01-02 18:43:55 Burf 10 NULL 

はここに私のSQL文です:

は、ここに私のデータです。そのIDセットに含まれるすべての検索エンジンが必要です。私はまたかなりのパフォーマンスのヒットを引き起こすので、入れ子になったSQL文を使用したくありません。

答えて

1
SELECT * FROM table A, 
(SELECT * FROM table WHERE url_id IN (3629,4115) group by url_id having max(id)) B 
WHERE A.id=B.id; 
+0

私はネストされたステートメントは望んでいませんでしたが、このクエリはトリックでした。 377Kの結果でデータベースに1.3秒で結果を返しました。ありがとう! – greatwitenorth

+0

ur welcome mate ... :) – Teja

+0

アップアップするには2ポイント以上必要です – greatwitenorth

0

サブクエリと派生テーブルの使用を避けたいとお考えのため、自己排除結合を使用してください。
説明:自己結合では、最初のテーブルを比較して最新のidを見つける別のテーブル、つまりurl_idの値がidでない行を作成します。これを返す

SELECT t.* 
    FROM yourtable t 
     LEFT JOIN yourtable t2 
     ON t2.url_id = t.url_id 
    AND t2.id > t.id 
WHERE t.url_id IN (3629,4115) 
    AND t2.id IS NULL; 

(B/C彼らは、この例では重要ではありませんテストしている間、私は最後の2列を省略):

 
14739 3629 2009-01-02 18:43:55 Alexa 
14739 3629 2009-01-02 18:43:55 Amfibi 
14739 3629 2009-01-02 18:43:55 Burf 
14741 4115 2009-01-02 18:43:55 Alexa 
14741 4115 2009-01-02 18:43:55 Amfibi 
14741 4115 2009-01-02 18:43:55 Burf 

SQLized here。 (セルフジョインはサポートされていないので、同じテーブルが定義され、2回入力されます。)

関連する問題