2017-05-28 11 views
0

現在、データベースで最も人気のある記事を3つ探しています。私はそれぞれのタイトルと表示量を印刷したいと思います。私はそうするためにテーブルの2つを一緒に結合しなければならないことを知っている(記事&ログ)。PostgreSQLニュースデータベースで3つの最も人気のある記事を見つける

記事テーブルにはタイトルの列があり、タイトルにはスラッグが1つあります。

ログテーブルには、/ article/'slug'という形式のパス列があります。

これらの2つのテーブルを結合し、記事テーブルのスラッグ列と比較するパスを除外し、カウントを使用して表示回数を表示するにはどうすればよいですか?

使用正しいクエリがあった。

SELECT title, count(*) as views 
FROM articles a, log l 
WHERE a.slug=substring(l.path, 10) 
GROUP BY title 
ORDER BY views DESC 
LIMIT 3; 
+1

これまでに試したことと一緒に、テーブル定義と必要なものの詳細な説明を含める必要があります。言葉で問題をはっきりと説明できない場合は、サンプルデータを追加して必要なものを表示します。 –

+0

Laurenzのコメントを言い換えると:**あなたの質問に**あなたの質問を追加し、そのデータに基づいていくつかのサンプルデータと予想される出力を追加してください。 [**フォーマットされたテキスト**](http://stackoverflow.com/help/formatting)、[スクリーンショットなし](http://meta.stackoverflow.com/questions/285551/why-may-i-not -upload-images-of-code-on-so-asking-a-question/285557#285557)。コメントにコードや追加情報を投稿しない –

+0

元の投稿は、RonaldFindlingのヘルプに基づいて正しい結果を得たクエリで編集されています。ありがとうございました! –

答えて

0

私が正しくあなたを理解している場合、あなただけの集約を使用して1列に基づいて2つのテーブルを結合する必要があります。キャッチは、それらを直接比較することはできませんが、前にstring functionsを使用しなければならないということです。

このようなスキーマと仮定:

article 
| title | slug | 
------------------- 
| title1 | myslug | 
| title2 | myslug | 

log 
|   path   | 
-------------------------- 
| /article/'myslug'  | 
| /article/'unmentioned' | 

には、次のような何か試してみてください:それは時に参考にすることができ、より複雑なクエリの場合

select title, count(*) from article a join log l where concat('''', a.slug, '''') = substring(l.path, 10) group by title; 

は、最初の図にあなたを助ける小さなクエリを記述後で全問合せを出す。たとえば、文字列関数が期待どおりの結果を返すかどうかを確認するだけです。

select substring(l.path, 10) from log l; 
select concat('''', a.slug, '''') from article a; 
+0

訂正していただきありがとうございますが、これはSQL標準の一部ではないようで、一部の実装でのみ動作します。私は自分の答えを更新しました。 – RonaldFindling

+0

他のSQL実装でも動作していても "文字列"はその一部ではないことがわかりました。 – RonaldFindling

+0

あなたが言っていることはすべて間違いないと私は確信していますが、私は全く異なるものを意味していました。文字列区切り文字として二重引用符を使用すると、一部のSQL実装では機能しますが、標準の一部ではありません。これについて長い議論を始めるつもりはない。 – RonaldFindling

関連する問題