我有一个标题为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
时 - 这是不正确的。
答案 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 ...