将COUNT集成到postgres查询中

时间:2016-10-19 00:24:47

标签: postgresql psycopg2

我有一个标题为users的表格,下面是tracks表格,下面是likes表格。 users表的用户ID为id列,tracks表的跟踪ID为id列,用户为user_ID列拥有该曲目的ID。 likes表格中包含喜欢该曲目的用户的user_id列,以及该曲目ID的track_id列。现在我的查询工作正常,但我想计算特定轨道ID的数量。

我当前的提取请求:

cur.execute('SELECT t.title, t.share, t.id, u.id, u.username, l.date_liked, '
                'FROM (tracks t INNER JOIN users u ON t.user_id = u.id)'
                'LEFT JOIN (SELECT * FROM likes WHERE user_id = %s)'
                'l ON l.track_id = t.id ORDER BY t.id DESC', [current_user.id])   

对于Postgres,我不是超级精明。我知道我需要做SELECT COUNT(track_id) FROM likes,但我不确定如何将它集成到我当前的查询中。

在下面的Alan Samets回答中,我能够得到这个:

cur.execute('WITH t_count AS'
                '(SELECT tracks.id,'
                        'COUNT(*) like_count '
                            'FROM tracks '
                                 'INNER JOIN likes '
                                     'ON tracks.id = likes.track_id '
                            'GROUP BY tracks.id)'
                ', t_mylike AS'
                '(SELECT likes.track_id, likes.date_liked FROM likes WHERE likes.user_id = %s )'
                'SELECT t.title, t.share, t.id, t_count.like_count, u.id, u.username, ml.date_liked '
                     'FROM tracks t '
                          'LEFT JOIN t_count '
                              'ON t.id = t_count.id '
                          'INNER JOIN users u '
                              'ON u.id = t.user_id '
                          'LEFT JOIN t_mylike ml ON t.id = ml.track_id '
                     'ORDER BY t.id DESC', [current_user.id])

这几乎完美无缺,但当用户喜欢自己的曲目时,它无法正确返回。现在,当用户喜欢其他用户跟踪时,它会返回喜欢的日期,但当用户喜欢其所有者跟踪其返回的None时 - 这是不正确的。

1 个答案:

答案 0 :(得分:0)

我相信PostgreSQL支持公共表表达式。我假设您正在编写的查询是驱动UI组件,并且您希望显示轨道信息,当前用户喜欢该轨道的日期以及总喜欢的数量。

WITH t_count AS 
(
     SELECT tracks.id
     ,      COUNT(*) like_count
            FROM tracks
                 INNER JOIN likes
                     ON tracks.id = likes.track_id
            GROUP BY tracks.id
)
SELECT t.title, t.share, t.id, t_count.like_count, u.id, u.username, l.date_liked
     FROM tracks t
          INNER JOIN t_count
              ON t.id = t_count.id
          INNER JOIN users u
              ON u.id = t.user_id
          LEFT JOIN likes l
              ON u.id = likes.user_id
     WHERE user_id = %s
     ORDER BY ...