0

私のデータベースはMySQLにあります。

次の表があると仮定します。

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

など...など。

次のようなクエリが必要です。

myTableから*を選択します。ここでnumber=25

ただし、さらに2つのアイテムを含めたいと思います。1つはその上に、もう1つはその下にあります(IDに基づく)。

クエリの結果セットは、次の結果セットになります:1、2、3。

数値66を選択した場合、結果セットには2、3、4などが含まれます。

アイデアは、「ねえ、1からこのクエリのIDを引いたもの、さらに1にこのクエリのIDを加えたものに等しいIDを持つものが欲しい」と言ってクエリの範囲を設定することです。

これが理にかなっていることを願っています。

どんな助けでも素晴らしいでしょう。

ありがとう!

PSこれのポイントは、特定のイベントが発生する前後に何が発生したかを確認できるように、イベントをログにキャプチャすることです。

4

3 に答える 3

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 ;

IDにギャップがある場合、これには3行が表示されないことに注意してください。

また、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(ほとんどの場合)。

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
     ) ;
于 2012-07-20T00:05:32.273 に答える
1

ORDER BYそれが機能するかどうかはわかりませんが(edクエリにLIMITはいくつかの制限があることを覚えていますがUNION、それをチェックするmysqlインスタンスがありません)、試してみるとどうなりますか?

(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)
于 2012-07-20T00:11:32.947 に答える
0
SELECT * FROM table WHERE id IN (SELECT id, id-1, id+1 FROM table WHERE number=25)
于 2012-07-20T00:04:35.720 に答える