当前位置: 首页 > 面试题库 >

SQL:如何使用DISTINCT保持行顺序?

年风华
2023-03-14
问题内容

以下SQL查询:

SELECT messages.id, messages.created_at, comments.created_at FROM messages
LEFT JOIN comments ON comments.message_id = messages.id 
WHERE (messages.id IN (429,443)) 
ORDER BY GREATEST(messages.created_at, comments.created_at) DESC

返回:

 id         messages.created_at     comments.created_at
--------------------------------------------------------
 443                2                       5
 429                1                       4
 443                2                       3

 (I replaced dates with numbers for readability)

id添加一次,只需添加一次即可DISTINCT

SELECT DISTINCT messages.id FROM messages
LEFT JOIN comments ON comments.message_id = messages.id 
WHERE (messages.id IN (429,443)) 
ORDER BY GREATEST(messages.created_at, comments.created_at) DESC

但是,结果id值改变了顺序:

id
---
429
443

可能是什么原因呢?

我如何保留订单?


问题答案:

distinct关键字是做什么它应该做的事情,回报每一个行与给定的列值。不同不允许您指定 哪些
这样的行会被退回,这是从原来的查询,这样的排序是允许清楚(存在一个跟随ID为429的行ID为443行)。

要控制将返回哪些行,您需要重新构造查询。我将采用的典型解决方案是使用group by,从每个组中选择组列和所需的行,以达到以下效果:

SELECT message.id, MAX(message.created_at) FROM message GROUP BY message.id;

如果需要执行更多操作,则将这种查询用作较大查询中的子选择,可能会加入id字段以从首选行中获取更多字段,或者以特定方式对查询进行排序。



 类似资料:
  • 问题内容: 使用SELECT WHERE IN()时,是否可以保持顺序?例如,使用以下查询: 结果将使用ID的默认顺序返回。1,7,54,55,56 当我想保留IN中使用的顺序时:56,55,54,1,7 有没有一种快速的方法可以在MySQL中执行此操作,或者我将被迫在代码后对其进行排序? 问题答案: 使用FIND_IN_SET:

  • 问题内容: 我想将一个键,值对添加到哈希表(或任何其他集合)中,但必须保持插入顺序。我怎样才能做到这一点? 就像我将1作为键“ 1”添加为值,将2作为键并将“ 2”添加为值。 输出应为: 问题答案: 以下是一些重要实现的特征差异: :“具有可预测的迭代顺序,通常是将键插入映射 的顺序 ( 插入顺序 )。” :“不保证地图的顺序” :“根据其键的自然顺序或按” 即是一个 因此,在这种情况下,您需要的

  • 我有一个熊猫DataFrame,它已经按日期排序,但我需要序列化这个DataFrame到一个保持行顺序的命令python结构,以便我以后可以返回一个JSON。 我使用一个dict,其中我有一些键和值,我需要数据帧作为一个值。我用pd。但这并不能保持行的顺序。 我尝试使用OrderedDict,但无法用json序列化。转储()。我正在使用python 2.7。 这是datraframe数据,我试图将

  • 问题内容: 这是我需要转换为更新的选择: 我的尝试: 不确定如何申请Distinct 问题答案: 根据您的评论,您不需要区分。只需执行以下命令: 您选择的所有内容都会更新。

  • 问题内容: 我创建一个从如下: 我想保持与中相同的迭代顺序。如何使用该方法创建一个? 问题答案: 在2个参数的版本采用的是: 要使用4参数版本,您可以替换: 与: 为了使它更简洁,请编写一个新方法并使用该方法:

  • 主要内容:语法,示例SQL DISTINCT 关键字需要和 SELECT 语句一起使用,用来删除结果集中所有重复的记录,仅保留唯一的一条记录。 数据表中有时候会有重复的记录,如果您只需要其中一条,就可以使用 DISTINCT 关键字。 关于 UNIQUE 关键字 UNIQUE 和 DISTINCT 的效果是等价的,都用来消除结果集中的重复记录,但是 UNIQUE 是一种老式的语法,Oracle 数据库曾经使用过。 后