2012-01-13 60 views
0

我目前有一个查询选择所有人正在查看视频的vid_id,并由大多数查看者对其进行排序。每次有人观看视频时,都会在scrusersonline中创建一个条目,其中的字段为vid_idusernametimestamp选择*其中标签名称在联结表中

我也有一个tag_map表和一个标签表。 tag_map包含字段idtag_idvid_id,标签包含字段tag_idname。我只想修改下面的查询,以便所有vid_id结果仅显示某个标签名称。提前感谢您的任何专家帮助。

查询我正在修改。 scrusersonline有字段vid_id时间戳用户名。它检索大多数用户查看vid_ids并按降序排序。我想进一步限制这些结果在一定标签名

SELECT SQL_CALC_FOUND_ROWS scrusersonline.vid_id, COUNT(scrusersonline.id) 
AS idcount FROM scrusersonline 
    GROUP BY scrusersonline.vid_id ORDER BY idcount DESC 

下面的查询,是简单地选择所有VID_ID与特定标签名的一个例子,但与视频表链接。我希望能够改变上面的查询,以便它仅显示标签名称结果

SELECT SQL_CALC_FOUND_ROWS video.* FROM tag_map 
       INNER JOIN tags2 ON tags2.tag_id = tag_map.tag_id 
INNER JOIN video ON video.vid_id = tag_map.vid_id 
    WHERE name IN (?) 
    ORDER BY video.timestamp DESC LIMIT ?, ? 

回答

1

下应该给你的结果:

SELECT SQL_CALC_FOUND_ROWS a.vid_id, count(a.id) as idCount 
FROM scruseronline as a 
INNER JOIN tag_map as b 
ON b.vid_id = a.vid_id 
INNER JOIN tags2 as c 
ON c.tag_id = b.tag_id 
AND c.name IN (?) 
GROUP BY a.vid_id 
ORDER BY idCount DESC 

哦,你不妨从tag_map删除id,因为其他字段应该的组合是唯一的,并且通常不会引用代理键。

+0

非常好,非常感谢您的时间和帮助X-Zero!顺便说一句,id是tag_map中唯一的字段。我认为引用每个连接会很有用。代表关键字被引用的含义是什么? – Scarface 2012-01-13 00:37:48

+1

'tag_map'中的'id'是_surrogate key_ - 也就是用于唯一标识表中的一行的人为(非属性数据)值。但是,对于纯/简单交叉引用表(如'tag_map'),它们没有意义 - 关系是(或应该是)唯一的行,并且组成实际数据的外键引用是完全可接受的关键。 'id'本身将几乎不会被引用 - 数据库将使用属性列,并且您应该由它们删除反正... – 2012-01-13 00:48:07

+0

是的,你是对的。我不知道我为什么离开它。我从来没有批评过它。再次感谢X-Zero,你真的很有帮助,我真的很感激。 – Scarface 2012-01-13 00:50:21