5

これを明確にしようと思います。

IDを使用せずに、特定の行と、その選択した行から1行前の相対的な行と、その選択した行から次の1行を選択する必要があります。これは可能ですか?要するに、前と次のもの。

ID を使用できない (方法がわからないだけかもしれません) 理由は、ID が順番になっていないためです。このやや未熟でランダムな例からわかるように、それらにはギャップがあります。

TABLE <-the name of the table
+----+----------------------+-------+
| id | name                 | value |
+----+----------------------+-------+
|  1 | some_name            | asf   |
+----+----------------------+-------+
|  4 | hello                | A3r   |
+----+----------------------+-------+
|  5 | how_do_you_do        | HR5   |
+----+----------------------+-------+
|  8 | not_bad              | 00D   |
+----+----------------------+-------+
| 12 | i_like_women         | lla   |
+----+----------------------+-------+
| 13 | are_you_serious      | 1Ha   |
+----+----------------------+-------+
| 15 | nah_i_kid            | Ad4   |
+----+----------------------+-------+
| 17 | it_is_just_the_boobs | Zc5   |
+----+----------------------+-------+
| 18 | thank_god            | 102   |
+----+----------------------+-------+
| 44 | no_kidding           | jjy   |
+----+----------------------+-------+

まず、列の 1 つから特定の値に基づいて 1 つの行を選択する必要があります。私はそれを行う方法を知っています:

SELECT `value` 
FROM `TABLE` 
WHERE name = 'i_like_women'

これにより、ID 12 で値が lla の行が 1 つ選択されます。

私が必要としているのは、別の少なくとも 2 つの行を選択することです。または、言い換えれば、この選択されたものに関連する前のものと次のもの。

つまり、1 つの値に基づいて 3 つの行を選択する必要があります。ご想像のとおり、私は MySQL を初めて使用します。

お時間とご関心をお寄せいただきありがとうございます。私を助けて楽しんでください。

4

5 に答える 5

9

以下は、3 つのレコードすべてを返すクエリです。

SELECT * 
FROM `TABLE` 
WHERE id >= (
    SELECT id 
    FROM `TABLE` 
    WHERE id < (SELECT id FROM `TABLE` WHERE name = 'i_like_women')
    ORDER BY id DESC 
    LIMIT 1
)
ORDER BY id ASC
LIMIT 3
于 2012-09-14T19:45:44.017 に答える
8

これを行う最も簡単な方法は、連続的ではありませんが、ID が昇順になっているという事実を利用することです。

例えば:

SELECT * FROM Table WHERE id = 8

UNION
--Select the first item less than 8
SELECT * FROM Table WHERE id = (SELECT MAX(id) FROM Table WHERE id < 8)

UNION
--select the first item greater than 8
SELECT * FROM Table WHERE id = (SELECT MIN(id) FROM Table WHERE id > 8)

文字列しかわからない場合は、次のようになります。

DECLARE _id INT

SELECT _id = id FROM Table WHERE value = 'i_like_women'

_id次に、8 の代わりに、これを上記のクエリに単純に入力できます。

テーブル名と列名を区別するために ` を使用する必要はないことに注意してください。

于 2012-09-14T19:29:21.610 に答える
4

前のものは次の方法で取得できます。

SELECT `value` 
FROM `TABLE` 
WHERE id < (SELECT id FROM `TABLE` WHERE name = 'i_like_women')
ORDER BY id DESC
LIMIT 1

反対のクエリを実行して、次のクエリを見つけることができます

于 2012-09-14T19:29:12.297 に答える
0

以下の質問に対するより良い簡単な答えを見つけました(次と前の行を見つける)、

$neighbors = $this->WorkDescription->find('neighbors',array('field' => 'id', 'value' => 3));

次のような出力が得られます-

Array
(
    [prev] => Array
        (
            [WorkDescription] => Array
                (
                    [id] => 1
                    [title] => Twenty
                    [ter_id] => 1
                    [cat_id] => 4    
                    [writer] => abk
                    [director] => Dir
                    [producer] => pro   
               )
        )

    [next] => Array
        (
            [WorkDescription] => Array
                (
                    [id] => 3
                    [title] => The Piper
                    [ter_id] => 1
                    [cat_id] => 3        
                    [writer] => abk
                    [director] => Dir
                    [producer] => pro
                )
           )
)
于 2015-10-27T13:07:30.647 に答える