我在桌子上:
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
即。基于名称行的唯一条目(当有多个相同名称时选择ID最低的条目),并按年龄排序
正确的SQL语句是什么?
我有:
Select * FROM table Where True GROUP BY Name ORDER BY Age
它似乎返回了许多独特的结果,但它太慢了(表格有> 250,000个条目,处理的时间大约需要30秒),我想知道是否有更快的方法来执行此操作?
答案 0 :(得分:0)
试试这个
SELECT *
从表 WHERE ID in(SELECT MIN(ID)FROM table group by name)
按年龄订购
您只需按名称对数据集进行分组并获取MIN(ID)
并将其用作选择的“where”条件
答案 1 :(得分:0)
另一种查询方法,通常在需要性能的地方更好,只要你有Name
上的INDEX(这不是一个选项):
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;
答案 2 :(得分:0)
由于您要根据最小ID
进行选择,这是一个唯一字段,您只需先获得每个名称的最小ID
个,然后加入ID
个到主表。这将比使用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