【问题标题】:MySql Query, Select greater thanMySql 查询,选择大于
【发布时间】:2008-12-11 21:14:19
【问题描述】:

我有一个名为 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 .

谢谢!

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    看起来太简单了,但看起来正是你需要的:

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

    【讨论】:

    • 一定要 ORDER BY sort_order DESC 否则你会得到奇怪的结果
    • ASC,因为他想要下一个最低的条目
    • 哎呀,我看到 ID = 3 并认为他的意思是 sort_order =3 。你明白了:D
    • 如果排序顺序变量是一个整数,就没有理由在它周围加上引号(它可能会干扰优化器)。
    【解决方案2】:
    SELECT * FROM table_name WHERE sort_order > 5 ORDER BY sort_order ASC LIMIT 1
    

    【讨论】:

      【解决方案3】:

      您可以使用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”是一项非标准的 Microsoft/Sybase 功能。 MySQL 不支持。
      • 对,这就是我放 LIMIT 的原因(因为我没有注意到标题,唯一标识 MySQL 的地方。):) LIMIT 是 SQL 标准吗?
      • 不,LIMIT 是非标准 SQL。据我所知,只有 MySQL/PostgreSQL/SQLite 支持。
      • 这就是我的想法 - 任何记录数限制都是非标准的(我想 Codd 和 Date 会喜欢的。)所以我的“便携式”断言是可以的。 :)
      【解决方案4】:
      SELECT 
          id, question, sort_order
      FROM faq_questions 
      WHERE sort_order in 
      (SELECT 
              MIN(sort_order) 
          FROM faq_questions 
          WHERE sort_order > ?);
      

      这似乎有效

      【讨论】:

      • 是的,这行得通。您也可以使用 = 而不是 IN,因为子查询返回单个值。
      猜你喜欢
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多