2010-08-09 40 views
4

我一直在计算一个标签被输入到数据库中的次数,并显示它已经与标签一起输入到数据库中的次数,就像这里的StackOverflow一样,但我可以' t似乎能够做到这一点,有人可以帮助我吗?MySQL计数问题

到目前为止,我可以得到标签,但不是数量。

在此先感谢您的帮助!

这是我的MySQL & PHP代码。

$dbc = mysqli_query($mysqli,"SELECT tags.*, posts_tags.* 
          FROM tags 
          INNER JOIN posts_tags ON tags.id = posts_tags.tag_id 
          GROUP BY tags.tag 
          ORDER BY tags.tag ASC"); 

if (!$dbc) { 
    print mysqli_error($mysqli); 
} 

while($row = mysqli_fetch_assoc($dbc)) { 
    $tag = $row['tag']; 

    echo '<a href="http://localhost/tags/">' . $tag . '</a>'; 

} 

回答

3

你可能想尝试以下操作:

SELECT  tags.tag, COUNT(DISTINCT posts_tags.post_id) as number_of_tags 
FROM  tags 
INNER JOIN posts_tags ON tags.id = posts_tags.tag_id 
GROUP BY tags.tag 
ORDER BY tags.tag ASC; 

测试用例:

CREATE TABLE tags (id int, tag varchar(10)); 
CREATE TABLE posts_tags (post_id int, tag_id int); 

INSERT INTO tags VALUES (1, 'javascript'); 
INSERT INTO tags VALUES (2, 'php'); 
INSERT INTO tags VALUES (3, 'mysql'); 

INSERT INTO posts_tags VALUES (1, 1); 
INSERT INTO posts_tags VALUES (2, 2); 
INSERT INTO posts_tags VALUES (3, 1); 
INSERT INTO posts_tags VALUES (4, 2); 
INSERT INTO posts_tags VALUES (5, 3); 
INSERT INTO posts_tags VALUES (6, 1); 
INSERT INTO posts_tags VALUES (7, 1); 
INSERT INTO posts_tags VALUES (8, 2); 
INSERT INTO posts_tags VALUES (9, 2); 
INSERT INTO posts_tags VALUES (10, 1); 

结果:

+------------+----------------+ 
| tag  | number_of_tags | 
+------------+----------------+ 
| javascript |    5 | 
| mysql  |    1 | 
| php  |    4 | 
+------------+----------------+ 
3 rows in set (0.00 sec) 
+0

感谢它的工作:) – helpME 2010-08-09 00:23:33

+0

@helpME帮助:还检查了OMG小马'的答案,如果你想显示标签的计数是'0'。 – 2010-08-09 00:29:21

+0

@Daniel Vassallo但是如果我计数tag.id,我的计数将永远是1不是吗? – helpME 2010-08-09 00:40:19

2

如果你想要的标签列表,其中包括计数为零的那些使用LEFT JOIN:

SELECT t.tag, 
      COALESCE(COUNT(DISTINCT pt.post_id), 0) AS tag_count 
    FROM TAGS t 
LEFT JOIN POSTS_TAGS pt ON pt.tag_id = t.id 
GROUP BY t.tag 
ORDER BY t.tag 

如果你只想看到那些已经使用一次或多次,使用INNER JOIN:

SELECT t.tag, 
     COUNT(DISTINCT pt.post_id) AS tag_count 
    FROM TAGS t 
    JOIN POSTS_TAGS pt ON pt.tag_id = t.id 
GROUP BY t.tag 
ORDER BY t.tag 
+0

是的,我忘了提及'LEFT JOIN' :) – 2010-08-09 00:28:42

+1

@Daniel Vassallo:有人必须让你的脚趾:) – 2010-08-09 00:30:03

+0

你为什么要把COUNT改成COUNT(DISTINCT tag_id)'?因为你是按标签分组的,所以不会总是显示'1'...'GROUP_CONCAT(pt.tag_id)'会返回类似'1,1,1,1,1'的东西。 – 2010-08-09 00:56:19