2013-04-24 97 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