Как оптимизировать выбор соединения для определенного диапазона критериев? - PullRequest
0 голосов
/ 10 июня 2019

У меня в коде два выбора, первый случайный выбор любых 20 спортсменов

db.Query("SELECT sp_no, first_name FROM sportsmen LIMIT ?,20", rand.Intn(100000))

Затем для каждого возвращенного спортсмена в цикле сделать еще один выбор из таблицы очков, где опубликованы их результаты в различных соревнованиях

db.Query("SELECT max(point) FROM points WHERE sp_no =" + spNo)

В результате у меня 20 спортсменов с именами по имени и по наибольшему количеству очков. Я ищу оптимизацию этих вариантов, чтобы объединить их в один, чтобы избежать зацикливания в коде, а затем измерить производительность.

Как иметь один оператор выбора, который возвращает first_name и их наивысшие баллы?

Похоже, это комбинация соединений выбирает, присоединяется и существует проверка?

Спасибо.

Ответы [ 2 ]

1 голос
/ 10 июня 2019

Вы можете объединить табличное выражение со вторым запросом, например:

select
  x.sp_no, x.first_name, max(point) as max_points
from (
  select sp_no, first_name
  from sportsmend 
  order by sp_no
  limit ?, 20
) x
join points p on p.sp_no = x.sp_no
group by x.sp_no, x.first_name
0 голосов
/ 10 июня 2019

Мы можем попробовать агрегировать по sp_no и упорядочить случайным образом:

SELECT s.sp_no, s.first_name, MAX(p.point) AS max_point
FROM sportsmen s
INNER JOIN points p
    ON s.sp_no = p.sp_no
GROUP BY s.sp_no, s.first_name
ORDER BY RAND()
LIMIT 20;

Обратите внимание, что этот подход полностью обрабатывает всю тяжелую работу непосредственно в MySQL.Код вашего приложения должен только выполнить вышеуказанный запрос и получить набор результатов.

...