这是表格:
id | name
------+---------
10 | val1
3 | val1
5 | val1
4 | val2
1 | val2
6 | val3
8 | val3
7 | val3
9 | val3
2 | val4
该表按值列排序,我保留此订单
如何获得id = 8之后的所有行以及使用此结果命名> val3?
id | name
------+---------
8 | val3
7 | val3
9 | val3
2 | val4
我尝试过如下查询:
SELECT FORM table WHERE id>8 AND VALUE name>'val3'
但显然不是我寻找的结果......任何想法?
修改1:
很抱歉,但是不可能更改数据库的设计,让我说我觉得很难说一个数据库是如何从一个通用表中设计来解释一个特定问题的。但是,是的,我知道查询是错误的,但我需要在第二列的值之后的所有行和FROM某个id值......它更清楚了吗?
编辑2:
当我说某个id值时,我不是在谈论id列的基本顺序,但是我在谈论之后的位置并且指定了id值
编辑3:
好的......我有一个按名称列排序的表格,如何只选择最后n行?我最终可以使用一个id值(在这种情况下为8)和一个名称值(在这种情况下为val3)......我知道它很不寻常......
编辑4:
好的我已经用更好的方式重写了这个问题here这个问题不再有用了请关闭它,谢谢你花了很多时间
答案 0 :(得分:0)
@mikeb在评论中是正确的。请考虑更改数据库的设计。
如果这不是一个选项而你只有这些数据。另外,您的样本数据也不正确。您希望输出中包含id = 2
和id = 7
的值但是您想要id>=8
(您说id>8
但是我想知道为什么用{{1}编写了行在示例输出中)。
如果你只想要
如何获取id> = 8之后的所有行以及值> val3具有此结果?
你可以做这样的事情
id=9
答案 1 :(得分:0)
我建议您在桌面上提供一致的订单。假设您想按名称订购,然后按ID订购,如下所示:
SELECT id, name
FROM myTable
ORDER BY name, id;
完成后,您可以使用变量来构建职位:
SET @position := 0;
SELECT id, name, @position := @position + 1 AS position
FROM myTable
ORDER BY name, id;
根据该表,您可以通过使用子查询来确定该位置,从而选择第8行位置之后的所有行,如下所示:
SELECT tmp.id, tmp.name
FROM(
SELECT id, name, @position := @position + 1 AS position
FROM myTable
ORDER BY name, id) tmp
WHERE tmp.position >= (somePosition);
要确定某个位置,可以使用以下子查询:
SELECT position
FROM(
SELECT id, name, @position := @position + 1 AS position
FROM myTable
ORDER BY name, id) tmp
WHERE id = 8;
以下是SQL Fiddle示例。
请注意,这只会返回8,9和2,因为正如我在开头提到的那样,您需要一致的订单。根据你的数据,没有办法写一个查询,知道7应该在8之后。
答案 2 :(得分:0)
如果您想要某行的最后n行,请按desc顺序排序,然后限制n
。
根据您提供的表格,您可以执行以下操作:
示例:
select *
from table
WHERE name > 'val3'
order by name desc, id desc
limit 4;
这只会为您提供名称> val3
的行,并按如下顺序对其进行排序(它先按降序排列名称,然后按降序排列id):
id | name
------+---------
2 | val4
9 | val3
8 | val3
7 | val3
6 | val3
限制4只会给您前4行:
id | name
------+---------
2 | val4
9 | val3
8 | val3
7 | val3