计算SQL表中每个不同值的数量

时间:2013-10-07 20:55:42

标签: php mysqli

我想知道是否有简单的方法可以获得我有多少行不同的值(不好解释,我知道)

示例:我有表,为​​我的博客文章注册视图。我想数一下,有多少人看过文章a和多少b(我有很多文章,我想获得前10篇最受欢迎的文章)

所以有一种简单的方法可以用SQL来实现这一点,目前我使用php数组,我得到了数组中所有不同的行,然后我得到每个数组值有多少行,然后我排序数组和回声前10,但这是太多的查询,我想知道,如果有办法用1个查询做到这一点?

2 个答案:

答案 0 :(得分:2)

select
  a.article_id,
  a.title,
  a.date,

  /* Make sure to count a relevant view from the *views* table. 
  -- This makes sure that count returns 0 instead of 1 when
  -- the article isn't viewed yet. */
  count(v.article_id) as viewcount

from
  Article a

  /* Using left join here, to also include articles that are not viewed at all.
  -- You can change this to an inner join if you don't want to include those. */
  left join ArticleView v on v.article_id = a.article_id

group by
  /* Group by article id, so count() actually counts per article. */
  a.article_id

order by
  /* Place the best viewed articles on top. */
  count(v.article_id) desc

  /* And return only 10 articles at most. */
limit 10

此查询将返回10篇文章,即使没有10篇文章也有。如果您只想返回实际拥有视图的文章,并且您不需要文章表中的其他字段,则可以稍微简化查询:

select
  v.article_id,
  count(v.article_id) as viewcount
from
  ArticleView v
group by
  v.article_id
order by
  count(v.article_id) desc
limit 10

但第一个查询的优点是您还可以在查询结果中添加'a'的其他字段,例如标题。因此,这个单一查询实际上可以返回生成整个前10个列表所需的所有信息,而第二个查询只提供一个id列表。

答案 1 :(得分:1)

使用sql分组很容易。

select articleid, count(*) from view_table group by articled

显然,您需要更改表格和字段。