0

我的桌子上有:

ID Name   Age
1  James  15
2  James  16
3  Joseph 16
4  Joseph 18
5  Steve  4

我想返回:

5 Steve 4
1 James 15
3 Joseph 16

IE。基于名称行的唯一条目(当有多个相同名称时,选择 ID 最低的一个),并按年龄排序

什么是正确的 SQL 语句?

我有:

Select * FROM table Where True GROUP BY Name ORDER BY Age

它似乎返回了很多独特的结果,但它太慢了(表有> 250,000个条目,处理时间> 30秒),我想知道是否有更快的方法来做到这一点?

4

3 回答 3

0

try this

SELECT *
FROM table WHERE ID in (SELECT MIN(ID) FROM table group by name)
ORDER by age

You just group the datasets by name and get MIN(ID) and use this as 'where' condition for your selection

于 2012-06-27T06:54:19.307 回答
0

由于您要根据 minimum 进行选择ID,这是一个唯一字段,您只需ID要先获取每个名称的 minimum s,然后将这些IDs 连接到主表。这将比在 a 中使用子查询快得多,WHERE因为最小值的子选择只执行一次,而子查询将对主表中的每一行执行(250,000 多次!)。

SELECT
    b.*
FROM
    (
        SELECT MIN(ID) AS minID
        FROM tbl
        GROUP BY Name
    ) a
INNER JOIN
    tbl b ON a.minID = b.ID
ORDER BY
    b.Age
于 2012-06-27T08:00:23.993 回答
0

查询这个的另一种方法,通常在需要性能的地方更好,只要你有(这里不是一个选项)一个 INDEX Name

SELECT *
FROM your_table t1
LEFT JOIN your_table t2 ON t1.Name = t2.Name AND t2.ID < t1.ID
WHERE t2.ID IS NULL;

这里有一个快速的解释

于 2012-06-27T06:59:18.463 回答