2008-08-28 43 views
0

比方說,我有四個表:PAGEUSERTAGPAGE-TAG如何獲取SQL IN子句中出現的次數?

Table  | Fields 
------------------------------------------ 
PAGE  | ID, CONTENT 
TAG  | ID, NAME 
USER  | ID, NAME  
PAGE-TAG | ID, PAGE-ID, TAG-ID, USER-ID 

而且,我們說,我有四頁:

PAGE#1 'Content page 1' tagged with tag#1 by user1, tagged with tag#1 by user2 
PAGE#2 'Content page 2' tagged with tag#3 by user2, tagged by tag#1 by user2, tagged by tag#8 by user1 
PAGE#3 'Content page 3' tagged with tag#7 by user#1 
PAGE#4 'Content page 4' tagged with tag#1 by user1, tagged with tag#8 by user1 

我希望我的查詢看起來是這樣的:

select page.content ? 
from page, page-tag 
where 
page.id = page-tag.pag-id 
and page-tag.tag-id in (1, 3, 8) 
order by ? desc 

我想得到這樣的輸出:

Content page 2, 3 
Content page 4, 2 
Content page 1, 1 

報價Neall

Your question is a bit confusing. Do you want to get the number of times each page has been tagged?

沒有

The number of times each page has gotten each tag?

沒有

The number of unique users that have tagged a page?

沒有

The number of unique users that have tagged each page with each tag?

沒有

我想知道有多少傳遞的標籤出現在某個特定頁面,而不僅僅是如果任何標籤的出現。

SQL IN像一個布爾操作符OR一樣工作。如果一個頁面被IN子句中的任何值標記,那麼它返回true。我想知道IN子句中有多少個值返回true。

下面我表明,輸出我想到:

page 1 | in (1,2) -> 1 

page 1 | in (1,2,3) -> 1 

page 1 | in (1)  -> 1 

page 1 | in (1,3,8) -> 1 

page 2 | in (1,2) -> 1 

page 2 | in (1,2,3) -> 2 

page 2 | in (1)  -> 1 

page 2 | in (1,3,8) -> 3 

page 4 | in (1,2,3) -> 1 

page 4 | in (1,2,3) -> 1 

page 4 | in (1)  -> 1 

page 4 | in (1,3,8) -> 2 

這將是我提到的網頁標籤表的內容之前:

id  page-id tag-id user-id 

    1  1  1  1 

    2  1  1  2 

    3  2  3  2 

    4  2  1  2 

    5  2  8  1 

    6  3  7  1 

    7  4  1  1 

    8  4  8  1 

@Kristof沒有什麼我正在尋找,但無論如何感謝。

@Daren如果我執行你的代碼我得到一個錯誤:

#1054 - Unknown column 'page-tag.tag-id' in 'having clause' 

@Eduardo的Molteni你的回答不給輸出的問題,而是:

Content page 2 8 
Content page 4 8 
content page 2 3 
content page 1 1 
content page 1 1 
content page 2 1 
cotnent page 4 1 

@Keith我正在使用普通SQL而不是T-SQL,並且我不熟悉T-SQL,因此我不知道如何將您的查詢轉換爲普通SQL。

還有什麼想法?

回答

1

OK,所以這和克里斯托弗的回答之間的主要區別在於,你只想要1計數顯示針對第1頁,因爲它已被標記爲只有一個標記(即使兩個單獨的用戶都標記了它)。

我建議這樣的:

SELECT page.ID, page.content, count(*) AS uniquetags 
FROM 
    ( SELECT DISTINCT page.content, page.ID, page-tag.tag-id 
     FROM page INNER JOIN page-tag ON page.ID=page-tag.page-ID 
     WHERE page-tag.tag-id IN (1, 3, 8) 
    ) 
    GROUP BY page.ID 

我沒有SQL Server安裝,檢查這一點,所以如果道歉有一個語法錯誤。但在語義上我認爲這是你需要的。在結束

 ORDER BY uniquetags DESC 

這可能不會給輸出遞減的標籤數的順序,但嘗試添加。我的不確定性在於,您是否可以在SQL Server中使用分組以外的ORDER BY。如果沒有,那麼你可能需要將整個東西嵌套在另一個SELECT中。

2

這可能會實現:

select page.content, count(page-tag.tag-id) as tagcount 
from page inner join page-tag on page-tag.page-id = page.id 
group by page.content 
having page-tag.tag-id in (1, 3, 8) 
0

在T-SQL:

select count(distinct name) 
from page-tag 
where tag-id in (1, 3, 8) 

這會給你不同的標記名稱的數量的計數爲您的ID列表

0

同意與Neall,有點混淆的問題。 如果你想在這個問題中列出的輸出中,SQL是簡單的:

select page.content, page-tag.tag-id 
from page, page-tag 
where page.id = page-tag.pag-id 
and page-tag.tag-id in (1, 3, 8) 
order by page-tag.tag-id desc 

但是如果你想在tagcount,達人解答您的問題

0
select 
    page.content, 
    count(pageTag.tagID) as tagCount 
from 
    page 
    inner join pageTag on page.ID = pageTag.pageID 
where 
    pageTag.tagID in (1, 3, 8) 
group by 
    page.content 
order by 
    tagCount desc 

這使你數每頁的標籤;通過較高數量的標籤

我希望訂購我明白你的問題正確

0

Leigh Caldwell的答案是正確的,謝謝你,但至少需要在MySQL中添加一個別名。所以查詢將如下所示:

SELECT page.ID, page.content, count(*) AS uniquetags FROM 
    (SELECT DISTINCT page.content, page.ID, page-tag.tag-id FROM page INNER JOIN page-tag ON page.ID=page-tag.page-ID WHERE page-tag.tag-id IN (1, 3, 8)) as page 
    GROUP BY page.ID 
order by uniquetags desc