Вот мое решение.Я подумал, что вместо того, чтобы просто дать рабочий запрос, я буду шаг за шагом проходить свой мыслительный процесс и запросы, которые я пробовал на каждом шаге:
Сначала давайте выберем 10 наименьших раз для различных uid
:
select uid, min(time)
from table_2
group by uid
order by 2
limit 10
Это дает нам:
uid | time
2 | 335
1 | 428
Это было легко ... к сожалению, это не позволяет нам получить первичный ключ, что будет проблемой, еслидобавлена следующая строка:
table_2
uid | elements | time | pkey
1 | 2 | 428 | 6
В будущих запросах, когда мы попытаемся объединиться на time
и uid
, мы получим две записи, а не 1. Поэтому нам нужен лучший запрос, которыйвозвращает отличное значение (например, pkey), а не time
, которое, как я предполагаю, может быть не различимым ...
Примечание: это было бы намного проще, если бы MySQL имел FIRST()
или LAST()
агрегатные функции.К сожалению, это не так, поэтому мы должны согласиться на комбинирование подзапроса, order-by, limit.
select
t2.uid,
(select pkey from table_2 t3 where t2.uid = t3.uid order by t3.time asc limit 1) as minpkey
from
(select uid, min(time) from table_2 group by uid order by 2 limit 10) t2
Теперь будут возвращаться результаты, с которыми мы можем работать:
uid | minpkey
1 | 5
2 | 1
Обратите внимание, что 5 был выбран случайным образом, и 6 могли быть выбраны так же легко;все зависит от того, как MySQL решит выбрать его.Но для нас это не имеет значения.
Далее мы хотим показать больше данных (а именно полей xid
и elements
):
select t1.xid as fid, t5.elements, t5.time
from
(select
t2.uid,
(select pkey from table_2 t3 where t2.uid = t3.uid order by t3.time asc limit 1) as minpkey
from
(select uid, min(time) from table_2 group by uid order by 2 limit 10) t2
) t4
inner join table_1 t1 on (t4.uid = t1.uid)
inner join table_2 t5 on (t4.minpkey = t5.pkey)
И альт, это должновернуть те же данные, которые вы предоставили в своем примере!Это может быть не очень эффективно, но должно работать!