假设我们有3个表:tweet,users,tweet_mentusers,其中tweet.user_id = users.id和tweet.id = tweet_mentusers.tweet_id。
该表的表示形式可以是:
tweet users tweet_mentusers
id | user_id id tweet_id | mentuser_id
----- -------- ------- --------- ------------
11 | 1 1 11 | 3
12 | 2 2 12 | 4
13 | 2 2 13 | 4
14 | 1 1 14 | 3
15 | 1 1 15 | 5
16 | 2 2 16 | 4
因此,我试图确定那些用户之间的交互。我在PostgreSQL中的查询是:
select id1, id2
from (
select tweet.id as tweetid, tweet_mentusers.mentionedusers_id as id1
from tweet
inner join tweet_mentusers on tweet.id = tweet_mentusers.tweet_id
group by 2, 1
) a inner join
(
select users.id as id2, tweet.id as tweetid
from users
inner join tweet on users.id = tweet.user_id
group by 1, 2
) b on a.tweetid = b.tweetid
因此,查询返回发推人员及其提及的人员的ID。但是,我想知道是否有一种方法可以只返回唯一的交互,也许还可以返回交互发生的次数,因为此查询返回所有交互。到目前为止,我已经尝试了一些组合尝试,但是我没有运气。如果您有任何建议,我将不胜感激!
您可以通过一对分组查询的结果(获得的交互次数mentioned
,tweeter
):
select mentioned, tweeter, count(*)
from (
select id1 mentioned, id2 tweeter
from (
select tweet.id as tweetid, tweet_mentusers.mentuser_id as id1
from tweet
inner join tweet_mentusers on tweet.id = tweet_mentusers.tweet_id
group by 2, 1
) a
inner join (
select users.id as id2, tweet.id as tweetid
from users
inner join tweet on users.id = tweet.user_id
group by 1, 2
) b
on a.tweetid = b.tweetid
) sub
group by 1, 2
order by 1, 2;
mentioned | tweeter | count
-----------+---------+-------
3 | 1 | 2
4 | 2 | 3
5 | 1 | 1
(3 rows)
但是,您的查询不必要地复杂。试试这个:
select mentuser_id mentioned, user_id tweeter, tweet_id
from tweet_mentusers m
join tweet t
on m.tweet_id = t.id
mentioned | tweeter | tweet_id
-----------+---------+----------
3 | 1 | 11
4 | 2 | 12
4 | 2 | 13
3 | 1 | 14
5 | 1 | 15
4 | 2 | 16
(6 rows)
最后:
select mentioned, tweeter, count(*)
from (
select mentuser_id mentioned, user_id tweeter, tweet_id
from tweet_mentusers m
join tweet t
on m.tweet_id = t.id
) sub
group by 1, 2
order by 1, 2;
mentioned | tweeter | count
-----------+---------+-------
3 | 1 | 2
4 | 2 | 3
5 | 1 | 1
(3 rows)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句