оптимизирующий запрос с функцией max - PullRequest
0 голосов
/ 25 июня 2011

Я хочу выбрать строку из таблицы с некоторыми условиями и максимальным значением некоторого параметра x (который является строкой). В настоящее время я делаю:

SELECT FROM myTable mm
WHERE       mm.userId = :userId
  AND       x = (
              SELECT MAX(x)
              FROM   myTable m
              WHERE  m.userId = :userId
                AND  (m.to = :contactNumber OR m.from = :contactNumber)
                AND       ...
            )

I 'Я не уверен, насколько оптимально Inno db выполнит этот запрос, но ему нужна помощь в улучшении этого запроса.Я использую спящий режим.

Ответы [ 3 ]

1 голос
/ 25 июня 2011
    SELECT TOP 1 * FROM myTable m
      WHERE m.userId = :userId
      AND  (m.to = :contactNumber OR m.from = :contactNumber)
      AND       ...
      ORDER BY m.x DESC
0 голосов
/ 25 июня 2011
SELECT mm.*
FROM myTable mm
  LEFT JOIN myTable m
    ON mm.UserId = m.UserId
   AND (m.to = :contactNumber OR m.from = :contactNumber)
   AND mm.x < m.x
WHERE mm.userId = :userId
  AND (mm.to = :contactNumber OR mm.from = :contactNumber)
  AND m.userId IS NULL

Это использует известный метод для поиска максимальных или минимальных значений, используя левое соединение к себе.В основном техника выглядит следующим образом:

 SELECT a.*
 FROM a
   LEFT JOIN a AS a2 ON a.key = a2.key AND a.value < a2.value
 WHERE a2.key IS NULL

Возвращает все строки из a с максимальными значениями value для каждого key.Для минимума вы бы просто заменили < на >.

0 голосов
/ 25 июня 2011

Аналогично ответу К.Зонненберга, но для MySQL:

SELECT * FROM myTable
WHERE userId = :userId
AND  (m.to = :contactNumber OR m.from = :contactNumber)
...
ORDER BY x DESC
LIMIT 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...