Mysql 根据一列从重复项中获取第一行

Mysql 根据一列从重复项中获取第一行,mysql,sql,mariadb,Mysql,Sql,Mariadb,我使用的是MariaDB版本10.2.21 有多行具有重复的用户id(列之一) 我希望获得每个用户标识的第一个匹配项,但不仅仅是用户标识,而是与第一个用户标识相关联的所有行 select distinct user_id, from user_table where user_id in (a,b,c,d,e,f,....) and date = '2020-02-25'; 现在,当我尝试添加相关列时,这正确地为我提供了所有不同的属性 EXPLAIN select

我使用的是MariaDB版本10.2.21

有多行具有重复的用户id(列之一)

我希望获得每个用户标识的第一个匹配项,但不仅仅是用户标识,而是与第一个用户标识相关联的所有行

select 
  distinct user_id,
from 
  user_table
where 
  user_id in (a,b,c,d,e,f,....) and 
  date = '2020-02-25';
现在,当我尝试添加相关列时,这正确地为我提供了所有不同的属性

EXPLAIN
select 
  distinct user_id,
  ST_X(location) as lng
from 
  user_table
where 
  user_id in (a,b,c,d,e,f,....) and 
  date = '2020-02-25';
它告诉我,我将获得200多万行。。。我只有3000个唯一的用户id 我只想获取第一个出现的用户id及其关联位置

由于我的数据库非常大,我需要充分利用索引,否则它会崩溃

我的索引是[user\u id,date],其中user\u id是第一个索引,date是第二个索引

所以我的问题是如何通过使用索引来获取唯一的(第一次出现=最上面一行)用户信息,这样我的数据库就不会中断

所以如果有

  user_id   location
    1       (123.22, 22.33)
    1       (111.22, 22.12)
    2       (155.33, 41.23)
    2       (160.41, 12.31)
我会得到

user_id   location
   1       (123.22, 22.33)
   2       (155.33, 41.23)

如果只有一个位置,请使用聚合:

select user_id, ST_X(min(location)) as lng
from user_table
where user_id in (a,b,c,d,e,f,....) and 
      date = '2020-02-25'
group by user_id;

如果只有一个位置,请使用聚合:

select user_id, ST_X(min(location)) as lng
from user_table
where user_id in (a,b,c,d,e,f,....) and 
      date = '2020-02-25'
group by user_id;

谢谢,min(位置)是做什么的??当我运行它时,它仍然会返回相同数量的行,2649544@Ambleu . . . 这将为每个用户返回一行。根据你的问题,这不是200多万行。你的意思是,即使我在EXPLAIN语句中运行它并说rows=2+mil,但当我实际运行代码时,它将返回每个用户的行数?@Ambleu。它需要处理所有行,但每个用户只返回一行。
ST_X()
函数在
groupby
@Ambleu之后运行。SQL表表示无序集。除非列指定了排序,否则没有“第一”行。谢谢,最小(位置)是什么??当我运行它时,它仍然会返回相同数量的行,2649544@Ambleu . . . 这将为每个用户返回一行。根据你的问题,这不是200多万行。你的意思是,即使我在EXPLAIN语句中运行它并说rows=2+mil,但当我实际运行代码时,它将返回每个用户的行数?@Ambleu。它需要处理所有行,但每个用户只返回一行。
ST_X()
函数在
groupby
@Ambleu之后运行。SQL表表示无序集。除非列指定了顺序,否则没有“第一”行。