【问题标题】:SQL select statementSQL 选择语句
【发布时间】:2011-06-09 11:01:53
【问题描述】:

我有一条 SQL 语句:

SELECT * 
  FROM users 
 WHERE username = 'bbb' 
    OR username = 'aaa' 
    OR username = 'ddd' 
    OR username = 'ccc'

表中 ddd 的 id 比 ccc 比 bbb 比 aaa 大。

现在,当它返回结果时,它总是按 id 对它们进行排序,例如:aaa、bbb、ccc、ddd。 但我希望它们保持与我输入它们相同的顺序:bbb、aaa、ddd、ccc。

有人可以帮我解决吗?

【问题讨论】:

    标签: sql select


    【解决方案1】:

    在 SQL 中,检索顺序是未指定的,除非您使用 ORDER BY 请求它。如果您想保留输入的顺序,请添加一个渐进式ROW_NUMBER 列并要求对其进行排序。

    【讨论】:

    • 某些数据库具有您不应该依赖的默认排序,但它们仍然存在。例如,默认情况下,MySQL InnoDB 表将返回按升序排列的结果 PRIMARY KEY。
    【解决方案2】:
    select * from users where username='bbb' 
    UNION
    select * from users where username='aaa' 
    UNION
    select * from users where username='ddd' 
    UNION 
    select * from users where username='ccc'
    

    尽管此查询可能实现您希望的结果,但正如用户 6502 所说,此查询中的顺序仍未指定,因此您不能安全地依赖它在不同的实现中返回。

    另外说明,如果您的 strange 排序顺序无关紧要,您应该只使用 WHERE IN 子句:

    select * from users where username in ('aaa', 'bbb', 'ccc', 'ddd', 'ccc')
    

    【讨论】:

    • 是的,我同意这是一种奇怪的变态。
    • 我得到“文本数据类型无法选择为 DISTINCT,因为它不可比较。”如果我使用联合
    • 如果没有看到您的架构,我无法直接帮助您。您的字段之一是文本类型,您需要将其转换为 varchar。
    • 或者,您使用的是 text 类型的字段,而它实际上应该是 varchar(用户名对我来说听起来像是 varchar 字段,而不是文本字段!)
    • 它是 varchar... 用于没有联合的简单选择语句。
    【解决方案3】:

    如果您在 users 表中有一个“id”列(ddd 具有“最大 id”),那么您可以执行以下操作:

    select * from users where username in ('aaa','bbb','ccc','ddd')
    order by id;
    

    ETA:如果 id 列在另一个表中,那么您必须执行连接才能获得正确的 id。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-29
      • 2017-08-22
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      相关资源
      最近更新 更多