【问题标题】:Joining on a Select Distinct in MySQL reorders by joined table通过连接表在 MySQL 重新排序中加入 Select Distinct
【发布时间】:2011-12-11 06:38:14
【问题描述】:

我四处寻找这个问题的答案,但没有找到。我有一个站点,其中文章存储在文章表中,作者在用户表中。我想获取按作者最近撰写文章的时间排序的作者列表。

这给了我用户 ID:

SELECT distinct a.user_id 
FROM `article` as a 
ORDER BY a.id desc

问题是,一旦我尝试通过加入订单更改来引入名称,以便它是通过用户 ID 进行的。我试过这个:

SELECT distinct a.user_id, u.name 
FROM `article` as a 
LEFT JOIN user as u on u.id  = a.user_id 
ORDER BY a.id desc, u.id desc

SELECT distinct a.user_id, u.name 
FROM `article` as a 
LEFT JOIN user as u on u.id  = a.user_id 
ORDER BY u.id desc, a.id desc

但两者都会改变名称的顺序。我显然在做一些愚蠢的事情,但是什么?

【问题讨论】:

  • 您想按他们最近撰写文章的时间排序,但正在按 ID 字段排序。为什么不是“ArticleWrittenDate”字段之类的?
  • 你是对的,当然:有一个written_on datetime 字段,但发布日期和 id 字段之间从来没有太大的差异,为了简单和新,我试图减少内容无论如何,我得到的答案都可以很容易地适应。 :)

标签: mysql join sql-order-by


【解决方案1】:

试试这个

SELECT a.user_id, u.name 
FROM `article` a 
LEFT JOIN user u on u.id = a.user_id 
GROUP BY a.user_id
ORDER BY a.id desc

【讨论】:

    【解决方案2】:

    您的 ORDER BY 按用户 ID 和/或文章 ID(取决于示例)对行进行排序。

    如果您希望按名称进行可靠排序,请在 ORDER BY 字段中包含 u.name 字段。

    【讨论】:

      【解决方案3】:

      以下内容应该可行:

      select users.id, articles.id, max(articles.created_at) as recent_date
        from users
        left join articles on users.id = articles.user_id
        group by articles.id
        order by recent_date
      

      不确定您的字段到底是什么名称,但这应该会为您指明正确的方向。

      您有很多答案可供选择...我相信您要问的关键是使用聚合函数 MAX() http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_max

      【讨论】:

        【解决方案4】:

        在您的第一个示例中,DISTINCT 恰好与 ORDER BY 一起使用的事实是侥幸,而不是标准 SQL。你需要这样的东西:

        SELECT a.user_id, u.name 
          FROM article a 
          LEFT JOIN user u ON u.id = a.user_id 
          GROUP BY a.user_id
          ORDER BY MAX(a.id) desc
        

        【讨论】:

        • 非常感谢!这绝对有效,我也理解。 :)
        【解决方案5】:

        这是 postgres 语法,但你可以很容易地把它翻译成 mysql

        select u.*, q.last_article_id 
           from user u
              inner join (
                select a.user_id, max(a.id) as last_article_id
                   from article a
                   group by a.user_id
              ) q
              on u.id = a.q.id
           order by q.last_article_id desc
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-03-22
          • 1970-01-01
          • 2022-08-16
          • 1970-01-01
          • 2016-06-28
          • 2022-12-02
          • 1970-01-01
          • 2013-09-19
          相关资源
          最近更新 更多