2011-04-19 2 views
1

가장 높은 긴급 성을 가진 항목의 ID 또는 - 특정 사용자에 대한 가장 낮은 ID를 받고 난이 다음과 같은 데이터베이스는 MySQL은 각 행

id | user | urgency | problem   | solved 

다른 사용자가 가지고있는 정보,하지만 이러한 사용자 모두 복수 항목이 있습니다

1 | marco | 0  | MySQL problem | n 
2 | marco | 0  | Email problem | n 
3 | eddy | 0  | Email problem | n 
4 | eddy | 1  | MTV doesn't work | n 
5 | frank | 0  | out of coffee | y 

내가 원하는 것은 다음과 같습니다. 일반적으로 모든 사람의 가장 오래된 문제를 먼저 확인합니다. 이 쿼리를 사용하여 가장 오래된 문제의 ID를 얻습니다. 사용자

하여 DB 그룹에서

선택 분 (id)이 날 오래된 문제 ID의리스트를 제공한다. 그러나 사람들이 좀 더 긴급한 문제를 만들 수 있기를 바랍니다. 각 사용자별로 가장 긴급한 ID 또는 긴급 성이 가장 높은 ID를

최대 ID (긴급)로 지정하면 문제의 ID를 알 수 없으므로 최대한 긴급이 필요합니다. 나는 밤새도록 여기에 있었지만, 나는 그 주위를 두렵게 생각한다. 이걸 도와 줄 수있는 사람은 누구야?

것은 명확하게하려면 : 나는 그것이

해결 이후 마지막 항목이 결과에 있어야

row | id 
0 | 1 
1 | 4 

결과로이 얻고 싶은

답변

0

다음은 당신에게 정확히 하나의 행 다시 얻을 것이다 - 가장 긴급하고 아마도 가장 오래된 문제 일 것입니다.

select id from my_table where id = (
    select min(id) from my_table where urgency = (
     select max(urgency) from my_table 
    ) 
) 

난 당신이 같은 긴급 레벨의 이러한 문제에 대한 가장 오래된 문제를 얻을 수 있도록 테이블에 create_date 열을 추가 제안하고 있었다. 하지만 이제는 그 목적을 위해 가장 낮은 ID를 사용하고 있다고 가정합니다.

하지만 이제는 그 목록을 원합니다. 이를 위해, 당신은 ID에 의해 결과를 정렬 것 :

select id from my_table where urgency = (
    select max(urgency) from my_table 
) order by id; 

[편집 :!에 의해 순서를 왼쪽]

잊지, 정직, 행 번호를 얻는 방법에 대해 설명합니다. 인터 웹에 누군가가 이런 일을 제안,하지만 아이디어는 작동하지 않는 경우 :

select @rownum:[email protected]+1 ‘row', id from my_table where ... 
+0

이것은 내가 찾던 내용이 아닙니다. 이것은 하나의 결과를 되돌려 주며 모든 ID 목록, 기본적으로 사용자별로 그룹화 된 목록, 가장 오래된 문제 (실제로 ID로 확인) 또는 가장 긴급한 문제의 ID가 필요합니다.ID는 괜찮습니다. 행 번호가 필요하지 않습니다. – patrick

+0

아마도 모든 사용자는 다음 쿼리를 통해 자신의 목록을 볼 수 있습니다. select * from problem where user = 'eddy'order by 긴급 명령, id asc 사용자 자신의 목록 나는이리스트들 각각에 대한 최상위 항목을 찾고 있습니다. 그룹화 및 정렬이 작동하지 않습니다. 왜냐하면 그룹화의 결과를 정렬하기 때문입니다. – patrick

+0

전체 게시물을 다시 읽으십시오. 나는 좋은 비트를 편집하고 있었다. 내가 끝내기 전에 네가 읽은 것 같아. – Marvo

0

이 작업을 수행하는 밀교 많은 방법이 있지만, 여기에 명확 것들 중 하나입니다.

SELECT 
    user, 
    MIN(id) AS min_id, 
    MAX(urgency) AS max_urgency 
FROM 
    db 
GROUP BY 
    user 

그런 다음 당신의 답변을 큰 쿼리에 논리적 테이블로 그 통합 :

먼저 당신의 분 ID와 최대 긴급 가서 쿼리를 작성

SELECT 
    user, 
    min_id, 
    max_urgency, 
    ( SELECT MIN(id) FROM db 
     WHERE user = a.user 
      AND urgency = a.max_urgency 
    ) AS max_urgency_min_id 
FROM 
(
    SELECT 
     user, 
     MIN(id) AS min_id, 
     MAX(urgency) AS max_urgency 
    FROM 
     db 
    GROUP BY 
     user 
) AS a 

은 명백한을 감안할 때 인덱스, 이것은 꽤 효율적이어야합니다.

1
Select ... 
From SomeTable As T 
    Join (
      Select T1.User, Min(T1.Id) As Id 
      From SomeTable As T1 
       Join (
         Select T2.User, Max(T2.Urgency) As Urgency 
         From SomeTable As T2 
         Where T2.Solved = 'n' 
         Group By T2.User 
         ) As MaxUrgency 
        On MaxUrgency.User = T1.User 
         And MaxUrgency.Urgency = T1.Urgency 
      Where T1.Solved = 'n' 
      Group By T1.User 
      ) As Z 
     On Z.User = T.User 
       And Z.Id = T.Id 
+0

가 내가 찾는 곳과 매우 가까워 보이는 것 같습니다! 데이터베이스에서 한 항목을 잊어 버렸으므로 해결되지 않은 문제 만 다시보고 싶습니다. 이 쿼리에서 "어디에서 해결 된 = 'n' '을 넣어야할지 모르겠습니다. – patrick

+0

@patrick - 두 개의 가장 내부 레벨에서 필터가 필요할 것 같습니다. 가장 안쪽에있는 사람이 필요합니다. 그렇지 않으면 해결 된 이슈가 가장 시급한 일일 수 있기 때문입니다. 주어진 사용자에 대한 가장 낮은 ID가 풀릴 수 있기 때문에 가장 가까운 다음 내부 조인에서 필요합니다. 그러나 우리가 이드에 가입 한 이후 가장 바깥쪽에있는 테이블에는 필요하지 않습니다. – Thomas

+0

긴급 성은 모든 사용자에게 고유합니다. 사용자는 해당 사용자의 가장 긴급 성보다 긴급 1을 설정하는 문제에만 우선 순위를 지정할 수 있습니다. 문제가 해결되면 긴급 성은 0으로 다시 설정됩니다. 따라서 동일한 사용자에 대해 동일한 긴급성에 대해 두 가지 문제가 발생할 위험이 없습니다. – patrick