2013-04-24 84 views
0

我们正在使用SQL创建一个类似twitter的数据库。我在创建存储过程时遇到问题:SQL - 允许用户使用

允许用户在他/她的推文中检索最常用的哈希标签。

UPDATE:这是我的存储过程

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; 
+0

似乎并没有在这里不被任何明显的逻辑通过频率排名#标签。你有什么尝试? – woemler 2013-04-24 16:48:01

+0

我希望有人指出我开始这个正确的方向。以上代码仅搜索推文。 – MySalsa 2013-04-24 19:42:15

回答

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

+0

它说:“没有行选择”我的SQL开发者 – MySalsa 2013-04-25 00:43:59

+0

我也需要这个存储过程或函数 – MySalsa 2013-04-25 01:05:29

+0

'WHERE userID = 3'可能会导致你的问题,如果你没有这样的用户ID。或者如果该用户从未使用过标签。我想你会想'userID = tuserID',假设你创建一个类似于问题中存储过程的参数。同样给你你的问题你应该能够创建你自己的存储过程或函数。 – 2013-04-25 05:26:52

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 

如果你想实际的标签,你需要从表包括hashtag标签名称加入。

如果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,以 'ROWNUM < = 2' 取代limit 2。如果您正在使用SQL Server或Sybase,请用select子句中的top 2替换它。

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

select t。* from(select ht。标签识别,COUNT(*)作为CNT 从tweet_hashtag HT由CNT降序 加入 鸣叫吨 上ht.tweetId = t.tweetId 其中ht.userid = tuserid 组由t.userid,ht.tagId 顺序)吨 其中rownum < = 2

+0

我需要最频繁而不是最近的。我已更新表格以显示其内容。 – MySalsa 2013-04-24 19:30:55

+0

@FlyToHeaven。 。 。这是最常见的。这就是'cnt desc'命令正在做的事情。 – 2013-04-24 20:00:16

+0

它给了我一个错误,即使我编辑了所有内容并添加了一个,它仍然没有正确结束。 – MySalsa 2013-04-24 20:01:04