2011-02-03 49 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 2011-02-03 13:02:59

+0

具有最大相關性的前N個用戶。因此,對於每個現有的股票,我需要一個具有最大相關性的用戶 – xpepermint 2011-02-03 13:07:58

回答

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 2011-02-03 16:21:02

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的時候,大家都說聯接很慢,使用subquerys。不知道這是否仍然適用。

編輯:我在MySQL中測試了它的值(和一個添加的代號表),它的工作原理。

編輯:當然,你可以通過改變LIMIT 1改變「N」的用戶...將LIMITň

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 

仍然遠離最佳:)。