2017-08-10 125 views
0

我有使用MAX()和GROUP BY的問題。 我旁邊表:MAX()和GROUP BY的相關子查詢

personal_prizes

 
___________ ___________ _________ __________ 
| id  | userId | specId| group | 
|___________|___________|_________|__________| 
| 1  | 1  | 1  |  1 | 
|___________|___________|_________|__________| 
| 2  | 1  | 2  |  1 | 
|___________|___________|_________|__________| 
| 3  | 2  | 3  |  1 | 
|___________|___________|_________|__________| 
|  4  | 2  | 4  |  2 | 
|___________|___________|_________|__________| 
|  5  | 1  | 5  |  2 | 
|___________|___________|_________|__________| 
|  6  | 1  | 6  |  2 | 
|___________|___________|_________|__________| 
| 7  | 2  | 7  |  3 | 
|___________|___________|_________|__________| 


prizes 
___________ ___________ _________ 
| id  | title | group |  
|___________|___________|_________| 
| 1  | First | 1  | 
|___________|___________|_________| 
| 2  | Second | 1  | 
|___________|___________|_________| 
| 3  | Newby | 1  | 
|___________|___________|_________| 
|  4  | General| 2  | 
|___________|___________|_________| 
|  5  | Leter | 2  | 
|___________|___________|_________| 
|  6  | Ter | 2  | 
|___________|___________|_________| 
|  7  | Mentor | 3  | 
|___________|___________|_________| 

所以,我需要選擇用戶最高頭銜。 例如id = 1的用戶必須有獎品'Second','Ter'。 我不知道如何實現它在一個查詢((( 所以,首先,我儘量選擇用戶最高規範ID 接下來我嘗試:

SELECT pp.specID 
FROM personal_prizes pp 
WHERE pp.specID IN (SELECT MAX(pp1.id) 
        FROM personal_prizes pp1 
        WHERE pp1.userId = 1 
        GROUP BY pp1.group) 

而且它不工作 。所以請幫我解決這個問題 如果你幫助爲用戶挑選獎品,它將會很棒!

+1

什麼是你所期望的輸出? –

+0

你如何加入'個人獎品'與'personal_prizes' – Ali

+0

@Kannan Kandasamy在此查詢-2和6用戶id = 1。一般 - 'Second'和'Ter'這個用戶。我使用MySQL –

回答

0

我在這裏看到的問題是,prizes.id確實不是一個確定哪個是可靠的方法「最高」的獎金,但忽略這一點,我建議使用ROW_NUMBER()OVER()來定位每個用戶的「最高」獎勵,如下所示:

請參閱本SQL Fiddle

CREATE TABLE personal_prizes 
    ([id] int, [userId] int, [specId] int, [group] int) 
; 

INSERT INTO personal_prizes 
    ([id], [userId], [specId], [group]) 
VALUES 
    (1, 1, 1, 1), 
    (2, 1, 2, 1), 
    (3, 2, 3, 1), 
    (4, 2, 4, 2), 
    (5, 1, 5, 2), 
    (6, 1, 6, 2), 
    (7, 2, 7, 3) 
; 


CREATE TABLE prizes 
    ([id] int, [title] varchar(7), [group] int) 
; 

INSERT INTO prizes 
    ([id], [title], [group]) 
VALUES 
    (1, 'First', 1), 
    (2, 'Second', 1), 
    (3, 'Newby', 1), 
    (4, 'General', 2), 
    (5, 'Leter', 2), 
    (6, 'Ter', 2), 
    (7, 'Mentor', 3) 
; 

查詢1

select 
* 
from (
    select 
     pp.*, p.title 
    , row_number() over(partition by pp.userId order by p.id ASC) as prize_order 
    from personal_prizes pp 
    inner join prizes p on pp.specid = p.id 
    ) d 
where prize_order = 1 

Results

| id | userId | specId | group | title | prize_order | 
|----|--------|--------|-------|-------|-------------| 
| 1 |  1 |  1 |  1 | First |   1 | 
| 3 |  2 |  3 |  1 | Newby |   1 | 

通過改變ORDER BY內的結果可以 「反向」 o版本條款:

select 
* 
from (
    select 
     pp.*, p.title 
    , row_number() over(partition by pp.userId order by p.id DESC) as prize_order 
    from personal_prizes pp 
    inner join prizes p on pp.specid = p.id 
    ) d 
where prize_order = 1 

| id | userId | specId | group | title | prize_order | 
|----|--------|--------|-------|--------|-------------| 
| 6 |  1 |  6 |  2 | Ter |   1 | 
| 7 |  2 |  7 |  3 | Mentor |   1 | 

你可以在這個邏輯擴展到找到「每組最高獎」太

select 
* 
from (
    select 
     pp.*, p.title 
    , row_number() over(partition by pp.userId, p.[group] order by p.id ASC) as prize_order 
    from personal_prizes pp 
    inner join prizes p on pp.specid = p.id 
    ) d 
where prize_order = 1 


| id | userId | specId | group | title | prize_order | 
|----|--------|--------|-------|---------|-------------| 
| 1 |  1 |  1 |  1 | First |   1 | 
| 5 |  1 |  5 |  2 | Leter |   1 | 
| 3 |  2 |  3 |  1 | Newby |   1 | 
| 4 |  2 |  4 |  2 | General |   1 | 
| 7 |  2 |  7 |  3 | Mentor |   1 | 
+0

謝謝,但它doesn (我需要選擇_Second_和_Ter_ for user wid userId = 1 ... –

+0

什麼是**邏輯**?正如我在獎勵表中所說的id不可靠。獎品表中,表示「最高」?你有這個想法,但你還沒有向我們解釋它 –

+0

哦,對不起,我在評論中寫了它,但不得不在主要帖子中添加,這是我的錯。 。_personal_prizes_中的_specID_是_prizes中的_id_ _。所以起初,我需要選擇_specId_ _MAX(id)_ GROP BY _group_ WHERE userId是特定的用戶ID。之後,我需要通過_id_選擇獎品。正如我寫的,personal_prizes.specId = prizes.id。所以我必須根據specId上的先前結果選擇獎品。我想通過一個查詢實現DB –