mysql - मैं पदों की संख्या कैसे गिन सकता हूं?




count (4)

मैं मोबाइल फोन का उपयोग कर इस पोस्ट करता हूं ताकि मैं आपके द्वारा दिए गए बेला पर कोशिश नहीं कर सकूं। मैं 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;

संपादित करें: मैं DISTINCT के साथ COUNT जोड़ता हूं। देखें कि क्या यह हल हो।

यहां मेरी टेबल संरचना है:

-- 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_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 क्लॉज पर काम करना होगा। लेकिन मुझे नहीं पता कि वह बिल्कुल कैसे


क्या आपने क्वेरी को पोस्ट आईडी जोड़ने की कोशिश की?

मैंने आपके select बयान में count(r.post_id) as post_num जोड़ दी है और यह अपेक्षित परिणाम देता है

डुप्लिकेट निकालने के लिए, distinct उपयोग करें। क्या आप टैग तालिका के संबंध में गिनती चाहते हैं? प्रयत्न

  1. COUNT(distinct pt.post_id) AS post_count ; या
  2. COUNT(distinct r.post_id) AS post_count

आपके अपेक्षित परिणामों के बारे में कुछ चीजें बिल्कुल ठीक नहीं हैं- उदाहरण के लिए, आपके अपेक्षित परिणामों में आपके पहले चरण में शामिल होने की तारीख में आपके खंड में शामिल किया गया है, और मूल प्रश्न के परिणामों में ऐसे परिणाम शामिल हैं जो यूजर आईडी = 1 से नहीं हैं I मैं थोड़ा उलझन में हूँ लेकिन:

मुझे लगता है कि बस जोड़ने:

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;

उन लोगों के लिए जिनके पास अंडरस्कोर.जेएस शामिल हैं, वे आपके प्रोजेक्ट में शामिल कर सकते हैं:

_({a:'', b:''}).size() // => 2

या कार्यात्मक शैली:

_.size({a:'', b:''}) // => 2






mysql sql count