sql порядок вложенности

0

Это разъяснение на этом посту:

SQL выбирает только строки с максимальным значением в столбце

В принятом ответе вложенный запрос - это тот, который используется для вычисления max, и внешний запрос присоединяется к нему. Я попытался изменить порядок, но столкнулся с синтаксической ошибкой.

Запрос:

(SELECT id, MAX(rev) mrev
FROM docs 
GROUP BY id) b
join (select id, rev, content from docs) d
on b.id = d.id and d.rev = b.rev

Ошибка, с которой я столкнулся, заключается в следующем:

У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'b join (выберите id, rev, content from docs) d на b.id = d.id и d.rev = b.rev' в строке 3

Означает ли порядок здесь?

Вот ссылка: http://sqlfiddle.com/#!9/a6c585/64570

  • 0
    Выдает ошибку, вы пробовали?
  • 1
    Как я могу прокомментировать ваш запрос, если я не посмотрел и не попытался его выполнить?
Теги:

1 ответ

1
Лучший ответ

Вы можете написать этот запрос следующим образом.

SELECT d.*
FROM
(
  SELECT id, MAX(rev) AS maxrev
  FROM docs 
  GROUP BY id
) b
JOIN docs AS d
ON (b.id = d.id AND d.rev = b.maxrev)

Обратите внимание, как он выбирает из подзапроса для максимального оборота. Хотя подзапрос просто присоединяется к таблице.

Другой способ написать:

select d.*
from docs d
join (
  select id, max(rev) maxrev
  from docs
  group by id
) b
on b.id = d.id and b.maxrev = d.rev

Или если вы решитесь использовать СУЩЕСТВУЮЩИЕ:

SELECT *
FROM docs AS d
WHERE EXISTS (
  SELECT 1
  FROM docs AS b
  WHERE b.id = d.id 
  GROUP BY b.id
  HAVING d.rev = MAX(b.rev)
);
  • 0
    Спасибо LukStorms, я это знаю. Но я пытаюсь изменить порядок. Вы знаете, почему моя попытка не работает?
  • 0
    То есть вы хотите МИНУТУ вместо МАКСА?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню