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'
ただし、最初のクエリの利点は、タイトルなどの他のフィールドをクエリ結果に追加できることです。したがって、この 1 つのクエリで実際にトップ 10 リスト全体を生成するために必要なすべての情報を返すことができますが、2 番目のクエリは ID のリストのみを提供します。