MySQL按最大值分组
示例表(many2many=用户有多个ticker,ticker有多个用户): 我必须为每个股票代码选择具有最大相关性的用户-因此,对于每个股票代码,一个具有最佳相关性的用户。MySQL按最大值分组,sql,mysql,Sql,Mysql,示例表(many2many=用户有多个ticker,ticker有多个用户): 我必须为每个股票代码选择具有最大相关性的用户-因此,对于每个股票代码,一个具有最佳相关性的用户。 你会怎么做呢?像这样的事情应该可以: 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 u
你会怎么做呢?像这样的事情应该可以:
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
)
下面是我在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
我认为你可以做到这一点:
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时,每个人都说连接很慢,请使用子查询。不知道这是否仍然适用
编辑:我在MySQL中使用您提供的值(和一个添加的tickers表)对其进行了测试,结果证明它是有效的
编辑:当然,您可以通过更改限制1来更改“n”用户。。。限制
SELECT * FROM users_tickers LEFT JOIN users ON users.id = users_tickers.user_id WHERE ticker_id = 2 ORDER BY relevance DESC LIMIT 1;
这将为您提供所需的特定股票代码的信息。这就是你想要的吗?或者是最相关用户的完整列表?我正在寻找一个快速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
还远未达到最佳状态:)。您需要选择相关性最大的用户,或者选择相关性最大的前n名用户?相关性最大的前n名用户。因此,对于每个现有的股票代码,我需要一个具有最大相关性的用户。这将选择股票代码而不是用户。但这是您所说的:“因此对于每个现有的股票代码,我需要一个具有最大相关性的用户。”您可以发布一个示例结果表,以便我们知道它应该是什么样子吗?您的结果中有重复的股票代码。当然。它们在样本数据中重复出现。我们如何知道哪个股票代码是正确的?user_ticker表表示多对多关系。id为1的用户有两个标记,用户2有3,等等。。。是否只需要最高的ticker_id值?最低的?
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