示例表(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
...
我必须为每个股票代码选择具有最大相关性的用户 - 因此对于每个股票代码,一个用户具有最佳相关性。 你会怎么做?
答案 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
还远非最佳:)。