MySql查询,选择大于的记录

11

我有一个名为faq_questions的表格,其结构如下:

id int not_null auto_increment,
question varchar(255),
sort_order int
我正在尝试构建一个查询,该查询根据排序顺序选择具有下一个最高排序顺序的行。
示例:
id  question                sort_order
1   'This is question 1'    10
2   'This is question 2'    9
3   'This is another'       8
4   'This is another one'   5
5   'This is yet another'   4

假设我已知排序顺序的ID为4,我将其设置为5后,需要返回ID为3的行。因为无法保证sort_order是连续的,所以不能只选择 known_sort_order + 1。

谢谢!

4个回答

22

看起来很简单,但似乎正是你需要的:

SELECT id,question FROM `questions` 
WHERE `sort_order` > sort_order_variable
ORDER BY sort_order ASC 
LIMIT 1

1
ASC,因为他想要下一个最低的条目。 - Eran Galperin
糟糕,我看到ID = 3,以为他的意思是sort_order = 3。你懂的 :D - Matt Rogish
如果排序变量是整数(并且可能会干扰优化器),则没有理由在其周围加上引号。 - Bill Karwin
从我的个人经验来看,它将会干扰优化器。 - dkretz
@Eran:他想要排序为8的那一行,而不是3。 - Bill Karwin
显示剩余4条评论

3
SELECT * FROM table_name WHERE sort_order > 5 ORDER BY sort_order ASC LIMIT 1

2
你可以使用TOPLIMIT来完成它:
SELECT TOP 1 * FROM faq_questions
WHERE sort_order > 5
ORDER BY sort_order ASC

但这不如以下方法优雅和易于移植:

SELECT *  
FROM faq_questions AS f1  
LEFT JOIN faq_questions AS f2  
    ON f1.sort_order > f2.sort_order  
    AND f2.sort_order = 5  
LEFT JOIN faq_questions AS f3  
    ON f3.sort_order BETWEEN f1.sort_order AND f2.sort_order  
WHERE f3.id IS NULL

"TOP N" 是微软/赛博思非标准的功能。MySQL 不支持它。 - Bill Karwin
没错,这就是为什么我使用了LIMIT(因为我没有注意到标题,那里是唯一标识MySQL的地方)。:) LIMIT是SQL标准吗? - dkretz
不,LIMIT 不是标准的 SQL。据我所知,它只被 MySQL/PostgreSQL/SQLite 支持。 - Bill Karwin
这正是我所想的 - 任何记录数限制都是非标准的(我想Codd和Date会赞同)。因此,我的“可移植”断言是可以的。 :) - dkretz

0
SELECT 
    id, question, sort_order
FROM faq_questions 
WHERE sort_order in 
(SELECT 
        MIN(sort_order) 
    FROM faq_questions 
    WHERE sort_order > ?);

看起来可以工作


没问题,这样也可以。你也可以使用“=”代替“IN”,因为子查询只返回一个值。 - Bill Karwin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接