mysql كيف يمكنني حساب عدد المشاركات؟




count (2)

وفيما يلي هيكل الجدول الخاص بي:

-- 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 . كمان

الآن أريد أيضا أن أحسب عدد المشاركات لكل علامة. لذلك هذه هي النتيجة المتوقعة :

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 . ولكن أنا لا أعرف بالضبط كيف.

https://code.i-harness.com


أنا آخر هذا باستخدام الهاتف المحمول حتى لا أستطيع أن تحاول ذلك على كمان أعطيتم. أنا تعديل سكل لحساب عدد المشاركة باستخدام COUNT .

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;

تعديل: أضف كونت مع ديستنكت. معرفة ما إذا كان حلها.


لا تتطابق بعض النتائج المتعلقة بالنتائج المتوقعة تماما - على سبيل المثال، تتضمن النتائج المتوقعة مشاركات من قبل التاريخ الذي استبعدته في بند المكان، وتتضمن نتائج طلب البحث الأصلي نتائج ليست من معرف المستخدم = 1 حتى أنا مشوشة قليلا عموما ولكن:

أعتقد مجرد إضافة:

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

يجب أن تجعل هذا العمل؟

إذا لم يكن كذلك، يمكنك استخدام تحديد مضمنة في العبارة المحددة:

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;




count