2012-09-11 2 views
0

다른 사람들이 먹는 과일 목록을 얻으려고합니다.항목의 순서를 표시하는 쿼리

+-----------+ 
    ID Name 
+----+------+ 
    1 Paul 
    2 John 
    3 Nick 
+----+------+ 
Table: users 

+--------+--------+ 
    userID Fruit 
+--------+--------+ 
    1  Apple 
    2  Peach 
    2  Orange 
    2  Apple 
    3  Apple 
    3  Peach 
+--------+--------+ 
Table: eats 

이제는 누가 무엇을 먹었는지 쉽게 알 수 있습니다. 하지만 누가 과일을 먹었는지 알기 원한다면 2 번이나? 결과는 다음과 같습니다

+--------+----------+ 
    Name  Fruit 
+--------+----------+ 
    John  Orange 
    Nick  Peach 
+--------+----------+ 
Result 

SELECT Name, Fruit FROM users, eats WHERE ID = userID ... ??? 
+0

당신의 releationship이 잘못 .. –

답변

0

@lanzz가 지적했듯이 주문을 믿을 수는 없습니다. 시퀀스 유지 관리는 비용이 많이 들지만 시간 소인을 저장하고 행이 순서대로 반환된다고 가정 해 봅시다.

변수를 사용하여 각 이름에 대해 몇 행을 기록했는지 기억합니다. 동일한 사람을 보면서 변수를 반복하고 새 사람을 때릴 때 재설정하십시오. 그런 다음 원하는 시퀀스가있는 레코드 만 추출하십시오. (n의 값에 대해 사용자의 n 번째 행을 선택할 수 있다는 장점이 추가되었습니다.)

set @seen_name = null; 
set @seq = 1; 
select * from (
    SELECT Name, Fruit, 
    case when @seen_name is null OR @seen_name != name then @seq := 1 else @seq := @seq + 1 end as seq_formula, 
    @seen_name := name, 
    @seq as seq 
    FROM users, eats 
    WHERE ID = userID 
) foo 
where seq = 2; 

봐라 :

+------+--------+-------------+--------------------+------+ 
| Name | Fruit | seq_formula | @seen_name := name | seq | 
+------+--------+-------------+--------------------+------+ 
| John | Orange |   2 | John    | 2 | 
| Nick | Peach |   2 | Nick    | 2 | 
+------+--------+-------------+--------------------+------+ 
+0

아름답고, 정확히 내가 찾고 있었던 것이 었습니다. 사실, 내 실제 프로젝트에는 적절한 순서로 행을 가져올 타임 스탬프가 있습니다. Alain과 토론에 추가 한 모든 사람들에게 감사드립니다. –

0

이 쿼리가 테이블을 조인한다고 :

당신은 반환의 순서로, 명시 적으로 행을 주문하지 않고 관계형 데이터베이스에 행 순서에 의존 할 수

SELECT eats.Fruit, users.Name FROM eats, users WHERE users.ID = eats.userID

+0

당신은 실제로 단지 이미 질문에 포함 된 쿼리를 반복하고 있습니다. – lanzz

+0

@lanzz, 질문에 포함 된 작동하는 쿼리가 없습니다 ... 단 하나의 깨진 부분 쿼리. 너 무슨 소리하는거야? ;] –

+0

두 번째 코드 블록은 완전한 행 이름이 없어도 (실제로 모호하지 않은 열 이름이 없기 때문에) 마지막 행에서 사용자와 동일한 쿼리를 갖습니다. 당신의 대답은 그것에 아무 것도 추가하지 않는다. 당신은 줄임표와 물음표 (이것은 실행될 쿼리의 일부가 아니기 때문에 명백하게 제외된다. 그러나 물음표는 추가 할 다른 것을 궁금해한다는 표시이다. 쿼리에) – lanzz

0

행을 삭제하고 테이블에 새 레코드를 삽입하면 행이 달라집니다. 과일이 소비 된 순서를 명시 적으로 저장한다는 추가 열이 있어야합니다 (예 : sequence). 그런 다음 과일을 sequence = 2으로 선택하는 것이 간단합니다.

관련 문제