0

我们正在使用 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

    • TWEETHASHID
    • 推文
    • 哈希标签
  • 推文
    • 推文
    • 用户身份
    • 推特日期
    • 推文时间
    • 推文
  • 推特用户

这是我们搜索推文的存储过程:

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;
4

2 回答 2

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 <= 2'。top 2如果您使用的是 SQL Server 或 Sybase,请在select子句中将其替换为。

康拉德是绝对正确的。的正确格式rownum是:

select t.* from (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 ) t 其中 rownum <= 2

于 2013-04-24T17:47:31.987 回答
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;

演示

于 2013-04-24T22:35:36.553 回答