5

我会尽力说明这一点。

我需要在不使用 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   |
+----+----------------------+-------+

首先,我需要根据其中一列的特定值选择一行。我知道该怎么做:

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

这将选择 id 为 12 且值为 lla 的一行。

我需要选择另外至少两行:一行名称为“not_bad”,另一行名称为“are_you_serious”,但未指定。或者,换句话说,相对于这个选定的前一个和下一个。

简而言之,应该基于一个值选择三行。我是 MySQL 新手,你可以猜到。

感谢您的时间和关注。乐于帮助我。

4

5 回答 5

9

这是将返回所有三个记录的查询。

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 回答
1

此查询在第一条和最后一条记录上也可以正常工作

SELECT * FROM `products` WHERE `ProductId`  = (SELECT MAX(ProductId) FROM `products`  WHERE ProductId < 1)  AND SubCategoryId=1


UNION

SELECT * FROM `products` WHERE `ProductId`  = (SELECT MIN(ProductId) FROM `products`  WHERE ProductId > 1)  AND SubCategoryId=1


UNION

SELECT * FROM `products` WHERE `ProductId`  = (SELECT MIN(ProductId) FROM `products`  WHERE ProductId < 1)  AND SubCategoryId=1 


UNION

SELECT * FROM `products` WHERE `ProductId`  = (SELECT MAX(ProductId) FROM `products`  WHERE ProductId > 1)  AND SubCategoryId=1


ORDER BY ProductId ASC

我希望这能解决你的问题:)

于 2014-02-11T06:49:57.473 回答
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 回答