2013-02-27 48 views
1

我很难创建一个MySql查询,它将逐行搜索一个表,然后在每一边返回5个周围的行。Mysql得到一些前后行

的问题是各行按字母顺序排列,并基本点是让11行与当前正好在中间,而他们是按字母顺序排列,我们不能使用id字段

+0

我试图通过现场布置,然后导入使用PHP其导入到我的网页。然后解析它在页面上,这是不好的,因为我有一个大分贝 – 2013-02-27 10:18:41

回答

1

这对union非常简单。试试这个:

(select t.* from t where t.col <= YOURNAME 
order by t.col desc 
limit 6 
) 
union all 
(select t.* from t where t.col > YOURNAME 
order by t.col 
limit 5 
) 
order by t.col 

查询的第一部分返回前五个。第二个返回之后的五个。

顺便说一句,如果你有重复,你可能反而要这样:

(select t.* from t where t.col = YOURNAME) 
union all 
(select t.* from t where t.col < YOURNAME 
order by t.col desc 
limit 5 
) 
union all 
(select t.* from t where t.col > YOURNAME 
order by t.col 
limit 5 
) 
order by t.col 
+0

我喜欢这个主意,但我认为你错了代码中的某些东西,我不断收到错误= UNION的错误用法和ORDER BY – 2013-02-27 15:48:02

+0

@ Vadim.G。 。 。我忘了在子查询周围放置圆括号。当使用'order by'和'limit'时,它们是需要的。 – 2013-02-27 16:16:04

+0

是的,我抓住了那一个,但它不会返回正确的结果,第二部分返回正确的顺序完美,但第一部分返回desc而不是asc的所有结果,所以我试图做的是将所有内容作为结果并做一个排序依据,但它似乎返回一个错误。 有什么想法? – 2013-02-27 16:41:14

-1

尝试像下面,根据您的参数:

SELECT * FROM table WHERE id < 5 LIMIT 10 
UNION 
SELECT * FROM table WHERE id = 5 
UNION 
SELECT * FROM table WHERE id > 5 LIMIT 10; 
+0

像我说你不能使用ID,因为它dosnt有正确的顺序 – 2013-02-27 10:15:49

+0

OP指出,他不能依靠ID – Yaroslav 2013-02-27 10:16:47

1

所以,你要选择行范围,ROW_NUMBER应该是你的朋友,因为你说你不能依靠ID。请检查此广泛接受和详细的SO answer有关使用mySQL ROW_NUMBER

然后尝试工作SQL Fiddle code。但我仍在调整它,因为它通过设置WHERE tt.row_number between 3 and 7行上的值来恢复所需的行数,但这些行不在您所选择的行的周围。棘手的事情。

测试数据:

id col1 
1 adfg 
2 sg5r 
3 34tdfgdf 
4 ergdfd 
5 ghjghghj 
6 4gfhfrgfr 
7 zxcxvfdf 
8 sfdgd 
9 s8545454 
10 7jhgdfe45 
11 fbvmso 
12 sdfg9dj3 
13 zjvjude89 
14 _sdfdi3 

查询:

SELECT Table1.* 
    FROM Table1 
WHERE col1 IN (
       SELECT col1 
       FROM (SELECT t.col1, 
          @curRow := @curRow + 1 AS row_number 
         FROM Table1 t 
         JOIN (SELECT @curRow := 0) r 
        ) tt 
       WHERE tt.row_number between 3 and 7 
      ) 
ORDER BY col1; 

结果数据:

ID COL1 
3 34tdfgdf 
6 4gfhfrgfr 
4 ergdfd 
5 ghjghghj 
7 zxcxvfdf 
+0

查询看起来不错,但我需要它返回特定行的行,例如。 而搜索“sfdgd”,它应该返回 6 4gfhfrgfr 7 zxcxvfdf 8 sfdgd 9 s8545454 10 7jhgdfe45 – 2013-02-27 11:02:33

+0

是的,但正如我指出的那样,是一个棘手的情况下,如果你不能依靠ID。我尝试了不同的解决方案,但似乎使用'UNION'更简单。在网上搜索'mysql range row select'来获得和我一样的结果,这里有一些类似的问题,但是你需要调整以使用“围绕特定行”的问题。 – Yaroslav 2013-02-27 11:07:11

1

您可以用临时表解决这个问题,如果你没有太多的记录你的桌子:

create temporary table temp_yourtable(
    id int auto_increment, 
    ...., 
    primary key(id) 
) 
select ... from yourtable; 

select t.* from temp_yourtable t, temp_yourtable t1 
    where t1.thealpabeticcolumn = your_key and t.id between t1.id - 5 and t1.id + 5