Беда с SQL join, где, имея предложение - PullRequest
0 голосов
/ 25 ноября 2018

У меня проблемы с пониманием того, как составить запрос, который покажет мне «три самых популярных статьи» с точки зрения просмотров («Статус: 200 ОК»).

Есть 2 таблицы, с которыми я сейчас работаю.

  1. Таблица журналов
  2. Таблица статей

Столбцы вэти таблицы: Таблица "public.log"

 Column |           Type           |                    Modifiers                     
--------+--------------------------+--------------------------------------------------
 path   | text                     | 
 ip     | inet                     | 
 method | text                     | 
 status | text                     | 
 time   | timestamp with time zone | default now()
 id     | integer                  | not null default nextval('log_id_seq'::regclass)

Индексы:

и

                             Table "public.articles"

 Column |           Type           |                       Modifiers                       
--------+--------------------------+-------------------------------------------------------
 author | integer                  | not null
 title  | text                     | not null
 slug   | text                     | not null
 lead   | text                     | 
 body   | text                     | 
 time   | timestamp with time zone | default now()
 id     | integer                  | not null default nextval('articles_id_seq'::regclass)

Индексы:

.

Пока что я написал этот запрос, основываясь на своем уровне и текущем понимании SQL ...

SELECT articles.title, log.status 
FROM articles join log
WHERE articles.title = log.path
HAVING status = “200 OK”
GROUP BY title, status

Очевидно, что это неверно.Я хочу быть в состоянии извлечь три самые популярные статьи из базы данных, и я знаю, что «сопоставление» 200 OK с «заголовком статьи» покажет или подсчитает для меня один «просмотр» или попадание.Мой мыслительный процесс выглядит так: мне нужно определить, сколько раз этот article.title = log.path (1 уникальный) отображается в базе данных журналов (со статусом 200 OK), создав запрос.Мое задание - на самом деле написать программу, которая будет печатать результаты с «[мой код получает] базу данных», чтобы выполнить тяжелую работу с помощью объединений, агрегатов и предложения where… выполняя минимальную «постобработку» в коде Pythonсама. "

Любое объяснение, идея, подсказка ценится всеми StackOverflow ...

1 Ответ

0 голосов
/ 25 ноября 2018

Возможно, вот что вы имеете в виду:

SELECT
    a.title,
    COUNT(*) AS cnt
FROM articles a
INNER JOIN log l
   ON a.title = l.path
WHERE
    l.lstatus = '200 OK'
GROUP BY
    a.title
ORDER BY
    COUNT(*) DESC
LIMIT 3;

Это вернет три заголовка статьи, которые имеют самый высокий статус 200 посещений.Этот ответ предполагает, что вы используете MySQL.

...