2017-08-10 129 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 –