选择X“最近”的ID?

时间:2009-12-10 19:49:04

标签: sql mysql

假设您有一个包含名为“table_id”的整数主键的表

是否可以在单个查询中提取具有特定ID的行和它之前的X行以及之后的X行?

例如,如果你的id是(1,2,8,12,16,120,250,354),X是2而你的id是16,那么select应该返回带有id 8,12,16,120,250的行

我知道如何使用多个查询来完成它,我想知道在一次传递中做到这一点(子查询,联合和一切都很好)。

感谢您的帮助

6 个答案:

答案 0 :(得分:4)

试试这个:

select table_id from table where id > 16 order by table_id desc limit 2
union all
select table_id from table where id <= 16 order by table_id asc limit 3;

答案 1 :(得分:3)

您可以在之前的项目和项目以及之后的项目之间建立联合,但您必须使它们成为子查询以对它们进行排序:

select * from (
  select * from thetable where table_id >= 16 order by table_id limit 3
) x
union all
select * from (
  select * from thetable where table_id < 16 order by table_id desc limit 2
) y
order by table_id

答案 2 :(得分:0)

使用MySQL的LIMIT语法和UNION:

SELECT table_id FROM table WHERE id > 16 ORDER BY table_id ASC LIMIT 2
UNION
SELECT table_id FROM table WHERE id <= 16 ORDER BY table_id DESC LIMIT 3

答案 3 :(得分:0)

这在SQL Server中使用派生查询:

DECLARE @X int, @target_id int

SET @X = 2
SET @target_id = 8

SELECT [table_id]
FROM
(SELECT TOP ((@X * 2) + 1) [table_id]
      ,ABS(@target_id - [table_id]) AS [Diff]
  FROM [tblItems]
  ORDER BY [Diff] ASC) T
ORDER BY table_id ASC
GO

答案 4 :(得分:0)

以下是我将如何操作,它很简单,适用于有符号/无符号数字:

-- Finds the closest 5 productID's to 200
SELECT     productID, abs(productID - 200) as diff
FROM       products
WHERE      productID != 200
ORDER BY   diff, productID
LIMIT      5

如果您使用的是无符号数字,那么您需要首先投射该列:

-- Finds the closest 5 productID's to 200 (unsigned)
SELECT     productID, abs(CAST(productID as SIGNED) - 200) as diff
FROM       products
WHERE      productID != 200
ORDER BY   diff, productID
LIMIT      5

答案 5 :(得分:0)

尝试以下操作:不幸的是,我没有MySQL,但MS SQL Server版本可以运行。

SELECT  /*TOP (2*2 +1)    --MS SQL Server syntax */
        *
FROM    IDTable
WHERE   IDCol >= (
        SELECT  MIN(IDCol)
        FROM    (
                SELECT  /*TOP 2   --MS SQL Server syntax */
                        IDCol
                FROM    IDTable
                WHERE   IDCol < 16
                ORDER BY IDCol DESC limit 2
                ) t
        )
ORDER BY IDCol limit (2*2 +1)