【问题标题】:GROUP BY return the first record [duplicate]GROUP BY 返回第一条记录[重复]
【发布时间】:2017-05-07 20:23:32
【问题描述】:

据我所知mysql GROUP BY 分组到最后找到的记录。

GROUP BY第一条记录有什么解决办法吗?

我已经在 SQL 命令中设置了 ORDER,我需要 GROUP BY 返回第一条记录而不是最后一条记录。

编辑

这里是查询

SELECT 
  DISTINCT(master.masterID),
  langData.*,
  master.* 
FROM master_table as master 
INNER JOIN lang_table as langData ON 
langData.masterID=master.masterID 
GROUP BY master.masterID 
ORDER BY 
CASE 
    WHEN langData.lang='currentLang' THEN 1 ELSE 999 END , 
    master.name desc LIMIT 0,10 

上面的查询为多语言表选择masterID,假设首先返回currentLang中的记录,然后按名称排序,然后是所有其他语言。

别问我为什么不在JOIN里设置语言。这是要完成的方法。

所以到目前为止一切正常,预计我有语言 enfr 的记录。如果currentLangen 那么基于

langData.lang='currentLang' THEN 1 ELSE 999 END

en 的顺序是 1,fr 的顺序是 999,我没有得到 en 的值,而是得到了 fr 的值。

这就是我想分组到第一行的原因。

【问题讨论】:

  • 我不会问你为什么不在JOIN中设置语言,而是告诉你,这样是行不通的。 GROUP BY 中的未聚合表达式从每个组返回任意记录,如果值不同,则不应使用。您可以从master_table 返回任何记录(它们在每个组中都是相同的),但不能从lang_table 返回。无法保证将返回哪个记录,nada,niente。 BTW,为什么这里有DISTINCT,它的目的是什么?
  • 我正在尝试实现“首先按名称顺序给我当前语言的所有记录,然后按名称顺序给所有其他语言的所有记录”含义:如果当前语言为 EN,则获取 EN 的所有记录,然后获取其他语言的所有记录。如果语言表中的一条记录有EN,FR返回EN值。如果语言表EN不存在返回任何其他语言
  • 使用JOIN 很容易做到这一点,如下所述:explainextended.com/2009/08/10/fallback-language-names-mysql 但出于某些奇怪的原因(您甚至不想被要求),您不愿意使用它.

标签: mysql group-by


【解决方案1】:

我假设你在谈论类似的东西

SELECT  *
FROM    mytable
GROUP BY
        column

您不应在 GROUP BY 中使用未聚合的表达式,除非它们在组内都相同。

如果您想返回组中包含表达式最小值的记录,请使用:

SELECT  mo.*
FROM    (
        SELECT  DISTINCT column
        FROM    mytable
        ) md
JOIN    mytable mo
ON      mo.id = 
        (
        SELECT  id
        FROM    mytable mi
        WHERE   mi.column = md.column
        ORDER BY
                mi.column, mi.someorder
        LIMIT 1
        )

【讨论】:

    【解决方案2】:

    LIMIT 1 添加到您的查询中。

    【讨论】:

      猜你喜欢
      • 2020-02-17
      • 2016-06-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2019-06-29
      • 2020-03-17
      • 2016-01-02
      • 2018-09-13
      相关资源
      最近更新 更多