2013-08-21 182 views
0

我的表看起來像這樣匹配的一個領域,但責令其選擇記錄:另一個表的由不同領域

tags: id, name, description 
tag_relations: tag, item 

item引用ID和tag引用tags表的ID。

所以我想選擇最常用的標籤:

SELECT t.*, COUNT(r.item) AS item_count 
FROM tag_relations as r 
INNER JOIN tags as t ON r.tag = t.id 
GROUP BY t.id 
ORDER BY item_count 

其工作原理,但如果我添加

WHERE t.id = ? 

的ITEM_COUNT始終爲1 ...

是有什麼辦法可以通過select語句來選擇只有一個標籤或一組特定標籤的全局標籤?

回答

1

的Sql小提琴在

http://www.sqlfiddle.com/#!2/ba97d/1

SELECT name,count(item) as counter_item 
FROM tag_relations 
INNER JOIN tags ON 
tag_relations.tag =tags.id 
order by counter_item 

該行

where tags.id=1 

如果需要,可以

1

我沒有訪問MySQL的權限,但我可以訪問Microsoft SQLServer。我意識到你的標籤指定了mysql。即便如此,你提出的查詢SQLServer中失敗,錯誤

Msg 8120, Level 16, State 1, Line 1 
Column 'tags.name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 

......因爲選擇T *未在GROUP BY子句中包括在內。

不管怎麼說,以解決您的具體問題,你可以得到一個全球性的數量,同時仍然使用交叉連接選擇一個特定的記錄...

select 
    t.* 
    , vTagRelations.GlobalCountOfTagRelations 
    , vTags.GlobalCountOfTags 
from 
    tags t 
    cross join (select 
     count(tag_relations.tag) as GlobalCountOfTagRelations 
    from 
     tag_relations) vTagRelations 
    cross join (select 
     count(tags.id) as GlobalCountOfTags 
    from 
     tags) vTags 
where 
    t.id = 2 
1

SQLite中,可以添加使用子查詢:

SELECT *, (SELECT COUNT() FROM tag_relations WHERE tag=tags.id) AS item_count FROM tags WHERE id=?;