按GROUP BY分组后,返回第一条记录。

11
据我所知,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,但我得到的值是“fr”的值而不是“en”的值。因此,我想将其分组到第一行。


我不会问你为什么不在JOIN中设置语言,相反我会告诉你这样做是行不通的。在GROUP BY中未聚合的表达式将从每个组返回任意记录,并且如果值有所变化,则不应使用它。您可以从master_table返回任何记录(它们在每个组内都是相同的),但不能从lang_table返回。无法保证将返回哪个记录,没有任何保证。顺便问一下,你为什么在这里使用DISTINCT,它的目的是什么? - Quassnoi
我正在尝试实现“按名称顺序给我当前语言的所有记录,然后按其他语言的名称排序”这个目标。意思是:如果当前语言是英语,则获取所有英语记录,然后获取所有其他语言的记录。如果在语言表中,一个记录有英语和法语,则返回英语值。如果在语言表中不存在英语,则返回任何其他语言。 - ntan
这很容易通过像这里描述的JOIN来完成:http://explainextended.com/2009/08/10/fallback-language-names-mysql/,但由于某些奇怪的原因(你甚至不想被问到),你不愿使用它。 - Quassnoi
2个回答

12

我想你是在谈论类似于

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
        )

0
在你的查询中添加LIMIT 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接