SQL - 允许用户

时间:2013-04-24 15:31:20

标签: sql tweets

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

我们有以下表格:

  • 管理
  • 按照
  • 标签

    • HASHTAGID
    • TOPIC
  • Tweet_Hashtag

    • TWEETHASHID
    • TWEETID
    • HASHTAGID
  • 鸣叫
    • TWEETID
    • USERID
    • TWEETDATE
    • TWEETTIME
    • TWEETTEXT
  • TwitUser

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

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;

2 个答案:

答案 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;

DEMO