我们正在使用SQL创建类似Twitter的数据库。我在创建存储过程时遇到问题:
允许用户在他/她的推文中检索前2个最常用的哈希标记。
更新:这是我的存储过程
create or replace
procedure TOP_2_FREQUENT_HASHTAGS is
first_hashtag varchar2(255);
second_hashtag varchar2(255);
begin
with TopTwoHashtags
AS (
SELECT
t.userID,
th.HASHTAGID,
ROW_NUMBER() OVER (ORDER BY COUNT(th.TWEETID) DESC) r
FROM
Tweet_Hashtag th
INNER JOIN Tweets t
ON th.TWEETID = t.TWEETID
WHERE
userID = t.userid
GROUP BY
t.userID,
th.HASHTAGID
)
SELECT
ht.TOPIC
into first_hashtag
FROM
Hashtag ht
INNER JOIN TopTwoHashtags tt
ON ht.HASHTAGID = tt.HASHTAGID
WHERE
r < 3;
dbms_output.put_line('Top 2 most frequent hashtags: '|| first_hashtag);
exception
when no_data_found then
dbms_output.put_line('This user does not exist');
return;
end;
我们有以下表格:
标签
Tweet_Hashtag
这是我们搜索推文的存储过程:
create or replace
procedure search_tweets(ttwitext in tweets.tweettext%type, tuserID in tweets.userid%type )
is
twit_user tweets.userid%type;
twit_id tweets.tweetid%type;
twit_text tweets.tweettext%type;
begin
select tweettext into twit_text from tweets where userid = tuserid and tweettext like '%' ||ttwitext || '%';
if twit_text is not null then
dbms_output.put_line(twit_text);
end if;
exception
when no_data_found then
dbms_output.put_line('kersplat' );
return;
end;
答案 0 :(得分:1)
在SQL中,您可以使用SQL获取最常用的主题标签,例如:
select tagid, COUNT(*) as cnt
from tweet_hashtag ht
where userid = tuserid
group by userid, tagid
order by cnt desc
limit 2
如果你想要实际的标签,你需要从标签表中加入标签名称。
如果tweet_hashtag
表没有userid
,那么您可能需要加入tweets
表:
select ht.tagid, COUNT(*) as cnt
from tweet_hashtag ht join
tweets t
on ht.tweetId = t.tweetId
where ht.userid = tuserid
group by t.userid, ht.tagId
order by cnt desc
limit 2
如果您使用的是Oracle,请将limit 2
替换为“rownum&lt; = 2”。如果您使用的是SQL Server或Sybase,请将其替换为top 2
子句中的select
。
康拉德是绝对正确的。 rownum
的正确格式为:
选择t。* from(选择ht.tagid,COUNT(*)作为cnt 来自tweet_hashtag ht join 推文 在ht.tweetId = t.tweetId 其中ht.userid = tuserid t.userid,ht.tagId分组 通过cnt desc订购 )t 其中rownum&lt; = 2
答案 1 :(得分:0)
这就是我写它的方式。使用WITH
块,我会使用ROW_NUMBER
计算ROW_NUMBER
超过计数。
注意:这不会很好地处理关系,并会在发生任意行时撤回。如果要在这种情况下显示两个以上的主题标签
,则可以使用RANK
with TopTwoHashtags
AS (
SELECT
t.userID,
th.HASHTAGID,
ROW_NUMBER() OVER (ORDER BY COUNT(th.TWEETID) DESC) r
FROM
Tweet_Hashtag th
INNER JOIN Tweets t
ON th.TWEETID = t.TWEETID
WHERE
userID = 3
GROUP BY
t.userID,
th.HASHTAGID
)
SELECT
ht.TOPIC
FROM
Hashtag ht
INNER JOIN TopTwoHashtags tt
ON ht.HASHTAGID = tt.HASHTAGID
WHERE
r < 3;