4

这是我试图通过 MySQL 查询彻底解决的问题的简化视图。这不是我正在处理的实际表。

如果我有下表:

Name Buyer ID  
John Fred  4  
John Smith 3  
Fred Sally 2  
John Kelly 1

我想要一个查询返回以下内容:

Name Buyer ID      
John Fred  4  
Fred Sally 2  

这样我们按“名称”分组并显示最新的行/买家/ID。

我尝试通过执行嵌套选择语句来实现这一点,其中我首先执行“ORDER BY ID DESC”,然后在最外面的 SELECT 上执行“GROUP BY NAME”。而且,虽然这是解决问题的迂回方式,但似乎通过排序,正确的选择会返回给我。不幸的是,“GROUP BY”不能“保证”“Buyer”列将包含预期的条目。

有什么有用的建议可以将其作为查询实现吗?目前,我有一个在大型表转储上运行的查询的效率非常低的 PHP“版本”——绝对不是最佳选择。

4

2 回答 2

4

试试这个,子查询背后的想法是它ID为每次Name使用MAX聚合函数)获取最新的。然后将它与子查询的两列上的表本身连接起来。

SELECT  a.*
FROM    tableName a
        INNER JOIN 
        (
            SELECT name, MAX(ID) maxID
            FROM tableName
            GROUP BY name
        ) b ON a.Name = b.Name AND
                a.ID = b.MaxID
于 2012-11-16T03:47:07.943 回答
1

另一种选择是加载在子查询中排序的数据,然后对结果进行分组。我不能引用这一点,但我在几个地方读到过,这没有(明显的)性能影响。

所以像:

SELECT * 
FROM (
    SELECT * 
    FROM `yourtable` 
    ORDER BY `id` DESC
) as `tmp` 
GROUP BY `name`
于 2012-11-16T03:53:36.530 回答