2011-02-03 50 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 

仍然远离最佳:)。