6

我有一个文章表,其中包含每天的文章浏览次数。创建一个新记录来保存每篇文章的每一天的计数。

下面的查询获取所有时间前 5 个查看文章 ID 的文章 ID 和总浏览量:

SELECT article_id, 
SUM(article_count) as cnt
FROM article_views
GROUP BY article_id
ORDER BY cnt DESC
LIMIT 5 

我还有一个单独的文章表,其中包含所有文章字段。我想修改上面的查询以加入文章表并为每个文章 ID 获取两个字段。我尝试在下面执行此操作,但计数返回错误:

SELECT article_views.article_id, SUM( article_views.article_count ) AS cnt, articles.article_title, articles.artcile_url
FROM article_views
INNER JOIN articles ON articles.article_id = article_views.article_id
GROUP BY article_views.article_id
ORDER BY cnt DESC
LIMIT 5

我不确定我到底做错了什么。我需要做一个子查询吗?

4

3 回答 3

13

articles.article_title, articles.artcile_urlGROUP BY子句中添加:

SELECT 
  article_views.article_id, 
  articles.article_title, 
  articles.artcile_url,
  SUM( article_views.article_count ) AS cnt
FROM article_views
INNER JOIN articles ON articles.article_id = article_views.article_id
GROUP BY article_views.article_id,   
         articles.article_title, 
         articles.artcile_url
ORDER BY cnt DESC
LIMIT 5;

您没有得到正确结果集的原因是,当您选择未包含在GROUP BY或子句中的聚合函数中的行时, SELECTMySQL 会选择随机值。

于 2013-01-24T16:06:34.827 回答
3

您正在使用名为 Hidden Columns 的 MySQL (mis) 功能,因为文章标题不在group by. 但是,这可能会或可能不会导致您的问题。

如果计数错误,那么我认为您article_id在文章表中有重复。您可以通过以下方式检查:

select article_id, count(*) as cnt
from articles
group by article_id
having cnt > 1

如果出现任何问题,那就是你的问题。如果它们都有不同的标题,那么按标题分组(如 Mahmoud 建议的那样)将解决问题。

如果没有,修复它的一种方法如下:

SELECT article_views.article_id, SUM( article_views.article_count ) AS cnt, articles.article_title, articles.artcile_url
FROM article_views INNER JOIN
     (select a.* from articles group by article_id) articles
     ON articles.article_id = article_views.article_id
GROUP BY article_views.article_id
ORDER BY cnt DESC
LIMIT 5

这会为文章选择一个任意标题。

于 2013-01-24T16:14:05.103 回答
0

Your query looks basically right to me...

But the value returned for cnt is going to be dependent upon article_id column being UNIQUE in the articles table. We'd assume that it's the primary key, and absent a schema definition, that's only an assumption.)

Also, we're likely to assume there's a foreign key between the tables, that is, there are no values of article_id in the articles_view table which don't match a value of article_id on a row from the articles table.


To check for "orphan" article_id values, run a query like:

SELECT v.article_id
  FROM articles_view v
  LEFT
  JOIN articles a
    ON a.article_id = v.article_id
 WHERE a.article_id IS NULL

To check for "duplicate" article_id values in articles, run a query like:

SELECT a.article_id
  FROM articles a
 GROUP BY a.article_id
HAVING COUNT(1) > 1 

If either of those queries returns rows, that could be an explanation for the behavior you observe.

于 2013-01-24T16:15:01.140 回答