MySQL组按最大值

时间:2011-02-03 13:00:08

标签: sql mysql

示例表(many2many =用户有很多代码和代码有很多用户):

#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
...

我必须为每个股票代码选择具有最大相关性的用户 - 因此对于每个股票代码,一个用户具有最佳相关性。 你会怎么做?

5 个答案:

答案 0 :(得分: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
)

答案 1 :(得分: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

答案 2 :(得分: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 ...更改为LIMIT n

来更改'n'个用户

答案 3 :(得分: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;

这将为您提供您为给定股票代码请求的信息。这是你要求的吗?或与其最相关用户的完整的代码清单?

答案 4 :(得分: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

还远非最佳:)。

相关问题