2016-10-19 6 views
2

私はusersという表を持っています。それはtracksのテーブルであり、その下にはlikesというテーブルがあります。 usersテーブルのユーザーIDはid列、テーブルのトラックIDはid列、トラックを所有するユーザーIDの列はuser_ID列です。 likesテーブルには、トラックが好きなユーザーの場合はuser_id、トラックIDの場合はtrack_idの列があります。現在、私のクエリは完璧に動作していますが、特定のトラックIDが持つ好き嫌いの数をカウントしたいと思います。postgresクエリへのCOUNTの統合

私の現在のフェッチ要求:それはPostgresのに来るとき

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を行う必要があることを知っていますが、現在のクエリにどのように統合するのか分かりません。下記のアラン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

*好きなリストとその数を同じクエリで取得することはできません。 (技術的には可能ですが、結果として得られるデータセットは意味をなさないでしょう) – zerkms

+0

@zerkmsしたがって、2つのクエリに分割する必要がありますか? – 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

Research "共通テーブル式"この場合、1つのクエリに対して存在するVIEWのように機能します。ウェブ上にあるものの多くは、階層クエリのコンテキストで説明されていますが、サブクエリを使用するのと同じ方法で簡単に使用できますが、読みやすさは向上します。見てみるべきであるあなたの例で少し "匂い"を感じるいくつかのことがあります。どの言語を使用しているのかわかりませんが、パラメータを使用して文を呼び出す必要があります。フィルタリング/ WHERE式はおそらくサブクエリの外側に配置する必要があります。 –

関連する問題