這裏是我的表的結構:如何計算排名前兩位的標籤?
-- users
+----+--------+
| id | name |
+----+--------+
| 1 | Jack |
| 2 | Peter |
| 3 | Ali |
+----+--------+
-- 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 |
+----+-------------+---------+-------+------------+------------+
-- 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 |
+---------+--------+
-- tags
+----+--------+
| id | name |
+----+--------+
| 1 | php |
| 2 | html |
| 3 | css |
| 4 | mysql |
+----+--------+
現在我想要得到的用戶列表與他們的名譽,成績,前兩名上週標籤。我怎樣才能做到這一點?
注1:「頂拖標籤」意味着用戶在他們贏得了更多的回購兩個標籤。
注2:每個問題至少有1個標籤。
這裏是預期輸出:
+----+--------+-------+------------+----------+
| id | name | score | reputation | tags |
+----+--------+-------+------------+----------+
| 1 | Jack | 0 | 18 | css,php |
| 3 | Ali | 1 | 5 | html |
| 2 | Peter | 0 | 0 | NULL |
+----+--------+-------+------------+----------+
-- Note: It's ordered by reputation, score columns
這裏是什麼我已經試過:
SELECT u.*,
sum(r.score) as score,
sum(r.reputation) as reputation
/* WS_CONCAT(',', t.name) as tags */
FROM users u
LEFT JOIN reputation r ON r.user_id = u.id
/* I need more joins to get tags, I don't know how exactly */
WHERE r.date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 WEEK)
GROUP BY u.id
ORDER BY reputation, score
正如你看到的,我的查詢缺乏最後一列(標籤)。老實說,我不知道我該如何管理這樣的事情。你知不知道怎麼?
在TSQL中,我們必須使用STUFF()來創建逗號分隔的字段,就像你想要的,但它看起來像mysql使用GROUP_CONCAT。 –
我不明白你的頑固性。你可能在幾個小時甚至幾天之前就得到了這個答案(以及類似的問題)。但是沒問題。繼續。 – Strawberry