Как оптимизировать SQL-запрос?

У меня есть таблица с n записями ... например, 20 ... Из этих 20, 5 записей принадлежат 4 людям, то есть 4 человека, которые зарегистрированы в этой таблице 5 раз, всего 20 (в качестве примера) ... Запрос, который я должен получить, состоит только из 4 записей, и они соответствуют последней перерегистрации каждого человека, принимая во внимание, что в этой таблице есть столбец , дата начала в где значение даты меняется в порядке возрастания. У меня есть следующий код SQL:

SELECT * FROM MYTABLA T1 WHERE T1.fechainicio=(SELECT MAX(fechainicio) FROM MYTABLA WHERE idpersona=T1.idpersona)

Как вы видите, я задаю 2 вопроса (выберите) к одной таблице. Есть ли способ улучшить этот запрос? Ну, там будет тысячи записей ... Кроме того, я также делаю JOINS к 3 другим таблицам ..

Редактирование моего вопроса для лучшего объяснения ....

AQUI MUESTRO LAS CONSULTAS SQL QUE TENGO O ESTOY PROBANDO

Первый SELECT с JOIN делает все идеально, получая такой результат: Un total de 9 registros Он генерирует результат 9 записей, таблица имеет 10, но есть пользователь, который 2 раза и принесет только последний из этого пользователя ...

Вместо этого запрос, который дает мне @LCC, генерирует все 10 записей, например: 10 registros

Я понимаю, что при использовании подзапросов, где медленнее запрос, но я не знаю, как удалить этот подзапрос из где таким образом, что он продолжает приносить мне те же результаты, которые мне нужны (последний из каждого пользователя), и, таким образом, оптимизировать запрос.


0
задан 22.02.2018, 18:09
3 ответа

Ответ, который он разрабатывал, - точно равен тому, что ты прибыл, просто я отвечаю тебе, из-за которого я добавляю что-то mГЎs informaciГіn, что возможно может быть Гєtil. То, что ты ищешь, ты можешь решать это asГ-:

SELECT  pg.* 
    FROM pagoperiodicos pg 
    INNER JOIN (SELECT  idusuario, 
                        MAX(fechainicio) as fechainicio
                        FROM pagoperiodicos 
                        GROUP BY idusuario
        ) pg2 
        ON pg.idusuario = pg2.idusuario
        AND pg.fechainicio = Pg2.fechainicio

В кастильце: Мы возвращаем дату mГЎxima pagoperiodicos из-за idusuario и просто одного JOIN между таблицей и субконсультацией. Нас не удается лишить себя субконсультации сверху, но мы используем ее таким образом что он обычно mГЎs Гіptima, я говорю, что он имеет обыкновение, из-за которого "дорожки механизма непостижимые". Конечно эта консультация agradecerГ - во многий, у которого fechainicio был Г-ndice.

Итак, Вїes необходимый делать это этой формой? и возможно не, но завись от колонн, которые ты в конце концов будешь показывать. Если повторяются линии, но у колонн, которые ты будешь показывать всегда, есть та же стоимость, ты можешь делать прямо один GROUP BY всех колонн и решаешь тему, я думаю, что на это он указывает @gbianchi в Ваших комментариях.

Другая aclaraciГіn важно состоит, в том, что эта форма только funcionarГЎ, если действительно fechainicio - информация Гєnico, в ней prГЎctica только они autonumГ©ricos они это, из-за которого если возможно pudiГ©ramos говорить, что idpago сохраняет relaciГіn с нею antigГјedad реестров, podrГ-хозяева заменять MAX(fechainicio) MAX(idpago).

2
ответ дан 24.11.2019, 01:45
  • 1
    Ты находишься полностью в верном!! idpago сохраняй связь с древностью реестров, но передо мной предстали случаи, где мой клиент зарегистрировал настоящую оплату человека, и после, когда у него было время, regiistraria предыдущие платежи, таким образом что недавняя оплата, у которой была максимальная дата, оставалась последнего... Спасибо за ответ! – Nelson Sepulveda 22.02.2018, 23:53

Если линии, которые соответствуют единственному человеку только, различаются из-за поля fechainicio, следующий query подает тебя.

, Если ты нуждаешься в большем количестве полей, хотя сообщают в SELECT и в GROUP BY полям, которые равны для того же человека deberГ-эксперт мочь доставать ее informaciГіn, что ты нуждаешься, и для полей, которые различные, ты можешь использовать формулы (MAX, MIN, COUNT, и т.д.).

 SELECT idpersona, MAX(fechainicio)
    FROM MYTABLA T1
    GROUP BY idpersona
1
ответ дан 24.11.2019, 01:45
  • 1
    Привет! спасибо за ответ. Смотри комментарий, который оставляет его. Он говорит, что консультация составляет часть большой консультации, и если он нуждается во всех полях, - в этом случае не подает его. Имей в виду каждый раз, когда, комментируются ли вещи в вопросе, всегда лучше надеяться на то, что тот, кто спросил, осветляет эти вещи. – gbianchi♦ 22.02.2018, 17:41
  • 2
    Очень хорошо, прости из-за intromisió n. Ло tendré в счете для будущих случаев. – LCC 22.02.2018, 17:48
  • 3
    gbianchi, я не понимаю, к которому ты хочешь прибыть? Моя тревога состоит в том, чтобы знать, консультация, которую я показываю, может ли быть оптимизированной, таким образом что субконсультация, которая находится внутри WHERE, удалена. Nosé если было возможно, так как как комментарий в описании, я нуждаюсь в том, чтобы принести последний INSERT, который был сделан человеку... Таблица содержит платежи В МЕСЯЦЕ В МЕСЯЦ, который человек сделал... – Nelson Sepulveda 22.02.2018, 17:54
  • 4
    Нет проблем!! он не никакой вмешательство!! только имей это в виду для того, чтобы за твои ответы не проголосовали негативно. Также смотри CГіmo отвечать . в каждом ответе требуется иметь explicació n кода. Продолжи быть таким!;) – gbianchi♦ 22.02.2018, 17:54
  • 5
    Мы говорим о многих людях, тогда человек может оплатить 1 añ или, с месяца до месяца... Должно быть 12 реестров единственного человека, но только я нуждаюсь в том, чтобы принести последний реестр этого человека, имея в виду, что их много людей... – Nelson Sepulveda 22.02.2018, 17:54

SELECT pg.*, pg.valorplan-sum(p.valorabonado) as debe, sum(p.valorabonado) as totalpagado, count(*) as pagosrealizados, 
       (u.nombre || ' ' || u.apellido) as nombres, u.cedula, u.telefono, pl.nombreplan, e.nombreempleado, em.nombreempleado as empleado_actualizado
 FROM pagoperiodicos pg
 LEFT JOIN pagos p ON p.idpago=pg.idpago 
 LEFT JOIN planes pl ON pg.idplan=pl.idplan
 INNER JOIN empleado e ON e.idempleado=pg.idempleado 
 LEFT JOIN empleado em ON em.idempleado=pg.idempleadoactualizado 
 INNER JOIN usuario u ON u.idusuario=pg.idusuario 
 INNER JOIN (
 	SELECT idusuario, max(fechainicio) as maxima FROM pagoperiodicos GROUP BY idusuario
 ) as R
 ON pg.idusuario=R.idusuario AND pg.fechainicio=R.maxima
 GROUP BY pg.idpago, pl.idplan, u.idusuario, e.idempleado, em.idempleado
 ORDER BY fechaderegistro DESC  
-2
ответ дан 24.11.2019, 01:45
  • 1
    Правда в том, что увидев это решение, я не понимаю, как он смог подавать его в кому-то больше. Он не имеет ничего общего с query, который ты выдвигал, и одно из решений, которые дали тебе, - сообщение того, что ты поместил здесь. Он попросил бы у тебя следующий раз быть гораздо яснее с вопросом (и я не имею в виду расширение, если не в ясность, то, что tenes и queres делать) – gbianchi♦ 22.02.2018, 19:46
  • 2
    Если он имеет общее с query, который планировал, только, что это не разместил, я завершаю для не enrredar так в читателя, таким же образом как @Patricio Moracho дал ответ он лучшее формирует оптимизирования консультации. select внутри where более медленные, что сейчас только отсрачивает мне 250 ~ 300 м. – Nelson Sepulveda 23.02.2018, 00:00