6

1日の記事ビュー数を保持する記事テーブルがあります。各記事の個別の日のカウントを保持するために、新しいレコードが作成されます。

以下のクエリは、これまでに表示された上位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ごとに2つのフィールドを取得したいと思います。私は以下でこれをやろうとしましたが、カウントが間違って戻ってきています:

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_urlします。GROUP 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

記事のタイトルがにないため、非表示列と呼ばれるMySQL(mis)機能を使用していますgroup by。ただし、これが問題の原因である場合とそうでない場合があります。

article_idカウントが間違っている場合は、記事の表に重複があると思います。これを確認するには、次のようにします。

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

表示された場合は、それが問題です。それらがすべて異なるタイトルを持っている場合、(Mahmoudによって提案されたように)タイトルでグループ化すると問題が解決します。

そうでない場合、それを修正する1つの方法は次のとおりです。

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

あなたの質問は基本的に私には正しいように見えます...

ただし、返される値は、テーブル内の列がUNIQUEであるかどうcntかに依存します。これが主キーであり、スキーマ定義がないことを前提としています。これは単なる前提です。)article_idarticles

また、テーブル間に外部キーがある、つまり、テーブルの行の値と一致しない値がテーブルにarticle_idないことを前提としています。articles_viewarticle_idarticles


「孤立した」article_id値を確認するには、次のようなクエリを実行します。

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

記事内の「重複する」article_id値を確認するには、次のようなクエリを実行します。

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

これらのクエリのいずれかが行を返す場合、それは観察した動作の説明である可能性があります。

于 2013-01-24T16:15:01.140 に答える