SQL连接,where,having子句有问题

时间:2018-11-25 02:23:38

标签: python mysql sql database logging

我无法理解如何进行查询以显示“观点上最受欢迎的三篇文章”(“状态:200 OK”)。

我目前正在处理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 :(得分:0)

以下可能是您要记住的:

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。