2017-07-20 18 views
0

這裏是我的表的結構:如何計算排名前兩位的標籤?

-- 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 

正如你看到的,我的查詢缺乏最後一列(標籤)。老實說,我不知道我該如何管理這樣的事情。你知不知道怎麼?

+1

在TSQL中,我們必須使用STUFF()來創建逗號分隔的字段,就像你想要的,但它看起來像mysql使用GROUP_CONCAT。 –

+0

我不明白你的頑固性。你可能在幾個小時甚至幾天之前就得到了這個答案(以及類似的問題)。但是沒問題。繼續。 – Strawberry

回答

-2

您是否嘗試過使用子查詢?例如:

SELECT u.id,u.name, 
     sum(r.score) as score, 
     sum(r.reputation) as reputation, 
     (SELECT group_concat(t.name) FROM post_tag pt INNER JOIN reputations r ON r.post_id = pt.post_id INNER JOIN tags t ON pt.tag_id = t.id WHERE r.user_id = u.id ORDER BY sum(r.reputation) DESC LIMIT 2) 
FROM users u 
LEFT JOIN reputation r ON r.user_id = u.id 
GROUP BY u.id, u.name, score, reputation 
ORDER BY reputation, score; 
+0

謝謝,upvote。沒有測試,但它似乎是一場噩夢..! –

+1

我覺得順序是錯的,它不應該是sum(r.reputation)嗎? – Turo

+0

@turo我認爲你是對的,我最初認爲是「頂級標籤」,他的意思是標籤的最高使用數量,但顯然問題是基於信譽的頂級標籤。 – herbert

-2

您可能試過它。

SELECT DISTINCT u.*, 
    sum(r.score) as score, 
    sum(r.reputation) as reputation 
    GROUP_CONCAT(',', t.name) as tags 
FROM users u 
LEFT JOIN reputation r ON r.user_id = u.id 
LEFT JOIN post_tag pt ON(pt.post_id=r.post_id) 
LEFT JOIN tags t ON(t.id=pt.tag_id) 
WHERE r.date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 WEEK) 
GROUP BY u.id , 
ORDER BY reputation, score