2013-08-21 133 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=?;