2016-10-19 2 views
2

나는 users이라는 테이블을 가지고 있으며 그 아래에 tracks 테이블과 그 아래에 likes 테이블이 있습니다. users 테이블에는 사용자 ID에 대해 id 열이 있으며 tracks 테이블에는 트랙 ID에 대해 id 열과 트랙을 소유 한 사용자 ID에 대해 user_ID 열이 있습니다. likes 테이블에는 트랙을 좋아하는 사용자의 경우 user_id 열과 트랙 ID의 경우 track_id 열이 있습니다. 지금 내 쿼리가 완벽하게 작동하지만 특정 트랙 ID에 대한 좋아요 수를 계산하고 싶습니다.포스트그레스 쿼리에 COUNT 통합하기

나의 현재 인출 요청 :이 포스트 그레스에 관해서

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]) 

나는 슈퍼에 정통한 아니에요. 나는 SELECT COUNT(track_id) FROM likes을 할 필요가 있다는 것을 알고 있지만, 현재의 쿼리에 그것을 통합하는 방법을 잘 모르겠습니다. 이 거의 완벽하게 작동한다

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]) 

하지만, 사용자가 자신의 트랙을 좋아하는 경우 올바르게 반환하지 않습니다 아래 앨런 Samets 대답으로 주위 재생

, 나는이 함께 할 수 있었다. 현재 사용자가 다른 사용자 트랙을 좋아할 때 좋아하는 날짜를 반환하지만 사용자가 소유자 트랙을 좋아할 때 None을 반환하는 것은 잘못된 것입니다.

+0

같은 쿼리에서 좋아하는 사람과 그 사람의 수를 모두 얻을 수는 없습니다. (기술적으로 가능하지만 결과 데이터 집합은 의미가 없습니다.) – zerkms

+0

@zerkms 그래서 두 개의 쿼리로 나누어야합니까? – Brosef

+0

네, 그렇게 생각합니다. – zerkms

답변

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 ... 
+0

당신의 설명에 자리입니다. 내가 대답을 이해하는지 모르겠다. 여기서 무슨 일이 일어 났는지 설명해 주시겠습니까? – Brosef

+0

나는 그 문제를 해결하기 위해 답을 수정해야만했다. '1L'을 반환하는 것처럼 보입니다. 'L'은 뭐니? – Brosef

+1

연구 "공통 테이블 식" 이 경우 단일 쿼리에 대해 존재하는 VIEW처럼 작동합니다. 웹에있는 대부분의 항목이 계층 적 쿼리의 맥락에서 설명되지만 서브 쿼리를 사용하는 것과 동일한 방식으로 쉽게 사용할 수 있지만 가독성은 뛰어납니다. 예를 들어 살펴 봐야 할 몇 가지 "냄새"가 있습니다. 어떤 언어를 사용하고 있는지 모르겠지만 매개 변수를 사용하여 문을 호출하고 필터링/WHERE 표현식을 하위 쿼리 외부에 배치해야합니다. –

관련 문제