2012-07-20 4 views
0

내 데이터베이스는 MySQL입니다.SQL 쿼리 범위에서 항목을 선택하려면 어떻게합니까?

id   number 
1   45 
2   25 
3   66 
4   43 
...... 
...... 
...... 
30   54 
31   21 

등 ... 등

내가 지금 같은 쿼리 갖고 싶어 :

선택 * myTable에에서 수 = 25

나는 다음과 같은 테이블이 있다고 가정

하지만 두 개 이상의 항목을 추가하고 싶습니다 (하나는 ID 위).

다음과 같은 결과 세트와 될지는 내 쿼리의 결과 집합 : 나는 수 (66)를 선택한 경우 1, 2, 3

, 결과 세트, 2, 3, 기타 (4)을 포함 할 것

아이디어는 쿼리의 범위를 지정하는 것입니다. 이봐 요,이 쿼리의 ID에서 1을 뺀 ID와이 쿼리의 ID를 더한 값이 하나라도 필요합니다.

나는 이것이 의미가 있기를 바랍니다.

도움이 될 것입니다.

감사합니다.

P. 이것의 요점은 내가 전에 특정 이벤트가 식별자가있는 경우이 하지 3 개 행을 보여줄 것

+1

은 '숫자'가 고유합니까? '25'가 두 번 이상 표에 나타나면 어떻게 될까요? –

+0

숫자는 고유하지 않습니다. 25가 두 번 나타나면 결과의 총 수는 6이됩니다. – Kyle

답변

3
SELECT t.* 
FROM 
    myTable AS t 
    JOIN 
    (SELECT id 
     FROM myTable 
     WHERE number = 25 
    ) AS my 
    ON t.id BETWEEN my.id - 1 AND my.id + 1 ; 

공지 사항을 일어난 후 무슨 일이 있었는지 볼 수 있도록 로그에 이벤트를 캡처하는 것입니다 갭.

또한 number을 선택하면 (예 : 25) 두 번 이상 표시되지만 (k 배) 결과는 3 * k 행이됩니다. 차이가있는 경우


, 예상대로 id 열에서, 당신은이를 사용할 수 있습니다

SELECT * 
FROM 
    (SELECT t.* 
    FROM 
     myTable AS t 
     JOIN 
     (SELECT MIN(id) AS id 
      FROM myTable 
      WHERE number = 25 
     ) AS my 
     ON t.id <= my.id 
    ORDER BY t.id DESC 
     LIMIT 2 
) AS a 

UNION ALL 

SELECT * 
FROM 
    (SELECT t.* 
    FROM 
     myTable AS t 
     JOIN 
     (SELECT MIN(id) AS id 
      FROM myTable 
      WHERE number = 25 
     ) AS my 
     ON t.id > my.id 
    ORDER BY t.id ASC 
     LIMIT 1 
) AS b ; 

을 거기 id 열의 간격이 있고 number 그렇게 고유하지 않으면 매개 변수 (25)가 두 번 이상 표시 될 수 있지만 (k 번), 3*k 행 (거의 항상)을 반환하는 쿼리를 가질 수 있습니다.

그것이 작동하는지 (내가 UNION 에드 쿼리에 ORDER BYLIMIT에 대한 몇 가지 제한이 기억하지만, 그것을 확인하기 위해 MySQL 인스턴스가없는), 그러나3210
SELECT t.* 
FROM 
    myTable AS t 
    JOIN 
    (SELECT id 
     FROM myTable 
     WHERE number = 25 
    ) AS ti 
    ON t.id = 
    (SELECT tt.id 
     FROM myTable AS tt 
     WHERE tt.id < ti.id 
     ORDER BY tt.id DESC 
     LIMIT 1 
    ) 
    OR t.id = ti.id 
    OR t.id = 
    (SELECT tt.id 
     FROM myTable AS tt 
     WHERE tt.id > ti.id 
     ORDER BY tt.id ASC 
     LIMIT 1 
    ) ; 
+0

레벨의 응답자가 연속 ID에 의존하지 않는 증명 답변을 제공 할 수도 있습니다. – zerkms

+0

@zerkms : 괜찮습니까? 우리는 거의 동일한 답변을 게시 한 것 같습니다 :) –

+0

예, 훌륭합니다. 추신 : 나는'<='트릭으로'LIMIT 2'을 좋아한다 – zerkms

0
SELECT * FROM table WHERE id IN (SELECT id, id-1, id+1 FROM table WHERE number=25) 
+1

아무도 엄격하게 연속 ID를 보장하지 않습니다 – zerkms

+0

이 쿼리는 어쨌든 손상되었습니다. –

+0

oops, auto_increment의 또 다른 질문을 보았습니다./ – cegfault

1

확실하지 당신은 무엇을하려고하면 :

(SELECT t2.id 
FROM myTable t1 
INNER JOIN myTable t2 ON t2.id > t1.id 
WHERE t1.number = 25 
ORDER BY t2.id 
LIMIT 1) 

UNION ALL 

(SELECT t2.id 
FROM myTable t1 
INNER JOIN myTable t2 ON t2.id < t1.id 
WHERE t1.number = 25 
ORDER BY t2.id DESC 
LIMIT 1) 
관련 문제