2011-02-03 11 views
2

サンプルテーブル(many2many =ユーザーは多くのティッカーやティッカーを持っているが、多くのユーザーを持っている):最大値によるMySQLのグループ

#users 
id  relevance 
1  10   
2  6   
3  8   
4  3 
5  5 

#users_tickers 
user_id  ticker_id 
1   2 
1   3 
2   4 
2   1 
2   3 
3   2 
4   2 
... 

私は、各ティッカーの最大関連性をユーザーに選択する必要があります - ので、各ティッカーのための持つ一人のユーザー最高の関連性。 どうしますか?

このような何かを行う必要があります
+1

関連性の高いユーザーまたは関連性の高い上位nユーザーを選択する必要がありますか? – Lamak

+0

最大の関連性を持つ上位Nユーザー。既存のティッカーごとに、関連性の高いユーザーが必要です。 – xpepermint

答えて

2

:ここ

SELECT FROM users u 
INNER JOIN users_tickers ut ON ut.user_id=u.id 
WHERE NOT EXISTS(
    SELECT FROM users u1 
    INNER JOIN users_tickers ut1 ON ut1.user_id=u1.id 
    WHERE ut1.ticker_id=ut.ticker_id AND u1.relevance > u.relevance 
) 
0

は、私はT-SQLでこれを行うだろうかです。私はMySQLの方言に慣れていません。

SELECT * FROM users AS U 
INNER JOIN user_tickers t ON t.user_id = U.user_id 
WHERE U.RELEVANCE = (
SELECT MAX(RELEVANCE) FROM users as usub WHERE U.user_id = usub.user_id 
) 
ORDER BY U.relevance DESC 

Produces: 
user_id relevance user_id ticker_id 
1     10   1  2 
1     10   1  3 
3     8   3  2 
2     6   2  4 
2     6   2  1 
2     6   2  3 
4     3   4  2 
+0

結果にticker_id-sが重複しています。 – xpepermint

+0

もちろん。それらはあなたのサンプルデータで繰り返されます。どのticker_idが正しいかはどのようにして知ることができますか? user_tickerテーブルは、多対多の関係を表します。 ID 1のユーザーには2つのティッカーがあり、ユーザー2には3などがあります。最低? –

0

私はあなたがこれを行うことができると思います。

SELECT *, 
(SELECT U2.user_id FROM users as U2, users_tickers as UT2 
    WHERE UT2.ticker_id = T1.ticker_id 
    AND UT2.user_id = U2.user_id 
    ORDER BY U2.relevance 
    LIMIT 1) 
FROM tickers as T1 

これは良いコードであれば、私は知らないが、私は、これはあなたが探しているものだと思います。私がSQLをやった最後の時間は、ジョインズが遅いと言っていました。サブクエリを使用します。それがまだ適用されているかどうかはわかりません。

EDIT:あなたが与えた値(およびティッカーテーブルが追加された)でMySQLでテストしたところ、動作します。

EDIT:そしてもちろん、あなたは... LIMIT 1を変更することによって、「n」のユーザーを変更することができます。これは、あなたが与えられたティッカーのために要求された情報を与えるだろうn個

+0

これは、ユーザーではなくティッカーを選択します。 – xpepermint

+0

しかし、これはあなたが言ったことです: "したがって、既存のティッカーごとに、私は関連性の高いユーザーが必要です。"サンプル結果テーブルを投稿して、それがどのように見えるのかを知ることができますか? – joon

0
SELECT * FROM users_tickers LEFT JOIN users ON users.id = users_tickers.user_id WHERE ticker_id = 2 ORDER BY relevance DESC LIMIT 1; 

制限します。あなたが求めているのはこれですか?または最も関連性の高いユーザーのティッカーの完全なリスト?

0

私は高速SQLを探しています。私はこれを好きでした...

SELECT * 
FROM (
    SELECT id, relevance, ticker_id 
    FROM `users` 
    INNER JOIN users_tickers ON users_tickers.user_id=users.id 
    ORDER BY users.relevance DESC, users.created_at DESC 
) AS X 
GROUP BY ticker_id 
ORDER BY relevance DESC 
LIMIT 0,10 

まだまだ最適です:)。

関連する問題