2017-08-19 14 views
0

は、ここに私のテーブル構造である:どのように投稿数をカウントできますか?

-- reputations 
+----+-------------+---------+-------+------------+------------+ 
| id | post_id  | user_id | score | reputation | date_time | 
+----+-------------+---------+-------+------------+------------+ -- Suppose: 
| 1 | 1   | 1  | 1  | 5   | 1500489844 | -- out of last week 
| 2 | 4   | 3  | -1 | -2   | 1500499815 | -- out of last week 
| 3 | 2   | 3  | 1  | 5   | 1500584821 | 
| 4 | 3   | 1  | 1  | 5   | 1501389166 | 
| 5 | 2   | 4  | 1  | 5   | 1501399142 | 
| 6 | 2   | 1  | -1 | -2   | 1501399142 | 
| 7 | 4   | 1  | 0  | 15   | 1501481186 | 
| 8 | 5   | 1  | 1  | 5   | 1501481297 | 
+----+-------------+---------+-------+------------+------------+ 
-- Note: the last row came from an accepted-answer, that's why its score is 0 

-- post_tag 
+---------+--------+ 
| post_id | tag_id | 
+---------+--------+ 
| 1  | 2  | 
| 1  | 4  | 
| 2  | 2  | 
| 3  | 1  | 
| 3  | 4  | 
| 4  | 3  | 
| 5  | 1  | 
+---------+--------+ 

-- tags 
+----+--------+ 
| id | name | 
+----+--------+ 
| 1 | php | 
| 2 | html | 
| 3 | css | 
| 4 | mysql | 
+----+--------+ 

そして、ここで私のクエリです:

SELECT 
    t.tag, sum(r.reputation) AS tag_reputation, sum(r.score) AS tag_score 
FROM 
    users u 
    LEFT JOIN reputations r 
     ON r.user_id = u.id 
      AND r.date_time > 1500584821 
    JOIN post_tag pt ON pt.post_id = r.post_id 
    JOIN tags t ON t.id = pt.tag_id 
WHERE u.id = 1 -- Specific user: Jack 
GROUP BY 
    u.id, u.user_name, t.tag 
ORDER BY 
    u.id, tag_reputation DESC; 

そして、ここで現在の結果である:あなたが見ることができるように

tag | tag_reputation | tag_score 
----: | :------------- | :--------- 
css |    15 |   0 
php |    10 |   2 
mysql |    5 |   1 
html |    -2 |   -1 

が、結果はtag_reputationで注文された特定のユーザーの評判とスコアを持つタグのリスト。 Fiddle


今、私はまた、各タグの投稿数をカウントします。

tag | tag_reputation | tag_score | post_num 
----: | :------------- | :--------- | :------- 
css |    15 |   0 |  1 
php |    10 |   2 |  2 
mysql |    5 |   1 |  1 
html |    -2 |   -1 |  1 

私はそれをどのように操作を行うことができます。これは期待される結果のですか?私はpost_id列とGROUP BY節で作業しなければならないと思います。しかし、私は正確にどのように知りません。

答えて

1

私は携帯電話を使って投稿していますので、あなたが与えたフィドルで試すことはできません。私はCOUNTを使って投稿数をカウントするようあなたのSQLを修正します。

SELECT 
t.tag, 
sum(r.reputation) AS tag_reputation, 
sum(r.score) AS tag_score, 
COUNT(DISTINCT pt.post_id) AS post_num 
FROM 
users u 
LEFT JOIN reputations r 
    ON r.user_id = u.id 
     AND r.date_time > 1500584821 
JOIN post_tag pt ON pt.post_id = r.post_id 
JOIN tags t ON t.id = pt.tag_id 
WHERE u.id = 1 -- Specific user: Jack 
GROUP BY 
u.id, u.user_name, t.tag 
ORDER BY 
u.id, tag_reputation DESC; 

編集:DISTINCTでCOUNTを追加します。それが解決するかどうか見てください。

+0

Iはすでに存在している同じ郵便番号で 'reputations'テーブルにもう一つの行を追加しました。しかし残念なことに 'post_num'も増加しました。 http://dbfiddle.uk/?rdbms=mariadb_10.2&frd=5d92f3fdf78757136a7eaf04ebf01e30 –

+0

あなたの新しいフィドルでは、あなたは 'reputations'テーブルに同じ' post_id'(5)と 'user_id'(1)この記録は数えられませんか? –

+0

明らかにそうではありません。post_id(5)は重複しているため、一度カウントされます。 –

0

予想される結果については、where句で除外した日付の前に予想される結果が含まれ、元のクエリの結果にはユーザーID以外の結果が含まれているなど= 1ので、私は全体的に少し混乱していますが:

私はちょうど追加思う:

SELECT 
    t.tag, sum(r.reputation) AS tag_reputation, sum(r.score) AS tag_score, count(r.id) as post_num 

は、この作業を行う必要がありますか?そうでない場合

することは、あなたは、インラインを使用することができ、あなたのselect文で選択します。

SELECT 
    t.tag, sum(r.reputation) AS tag_reputation, sum(r.score) AS tag_score, 
    max((select count(r2.id) from users u2 
     LEFT JOIN reputations r2 ON r2.user_id = u2.id AND r2.date_time > 1500584821 
     JOIN post_tag pt2 ON pt2.post_id = r2.post_id 
     JOIN tags t2 ON t2.id = pt2.tag_id 
     where t.tag = t2.tag)) AS post_num 
FROM 
    users u 
    LEFT JOIN reputations r 
    ON r.user_id = u.id 
     AND r.date_time > 1500584821 
JOIN post_tag pt ON pt.post_id = r.post_id 
JOIN tags t ON t.id = pt.tag_id 
WHERE u.id = 1 -- Specific user: Jack 
GROUP BY 
    u.id, u.user_name, t.tag 
ORDER BY 
    u.id, tag_reputation DESC; 
3

クエリにポストIDを追加してみましたか?

selectステートメントにcount(r.post_id) as post_numを追加しました。gave the expected resultsです。

重複を削除するには、distinctを使用してください。あなたはタグテーブルに関して数えたいですか?お試しください。

  1. COUNT(distinct pt.post_id) AS post_count;または
  2. COUNT(distinct r.post_id) AS post_count
関連する問題