Последнее значение с использованием GROUP BY - PullRequest
0 голосов
/ 27 января 2019

Мне нужно взять последнее значение из таблицы, где can_id равно.
Итак, я пробовал этот запрос SQL

SELECT com.text, com.can_id 
FROM (SELECT * FROM comments ORDER BY id DESC) as com 
GROUP BY com.can_id

Но если я изменю ASC / DESC при первом выборе, второй выбор просто сгруппируется без сортировки и примет значение с первым идентификатором
Этот выбор будет использоваться как левое соединение в запросе.

Пример:
enter image description here

Мне нужно получить com.text со значением «text2» (длится)

Ответы [ 3 ]

0 голосов
/ 27 января 2019

Если вы используете MySql 8, вы можете использовать row_number:

SELECT com.text, com.can_id 
FROM (SELECT comments.*,
             row_number() over (partition by can_id order by id desc) rn
      FROM   comments) as com 
WHERE rn = 1;

Если вы используете MySql 5.6+, вы можете (ab) использовать group_concat:

SELECT SUBSTRING_INDEX(group_concat(text order by id desc), ',', 1), 
       can_id 
FROM   comments 
GROUP BY can_id;
0 голосов
/ 27 января 2019

В любой версии MySQL будет работать следующее:

SELECT c.*
FROM comments c
WHERE c.id = (SELECT MAX(c2.id)
              FROM comments c2
              WHERE c2.can_id = c.can_id
             );

При индексе comments(can_id, id) это также должно иметь наилучшую производительность.

Это лучше, чемgroup by подход, потому что он может использовать индекс и не ограничен некоторыми внутренними ограничениями на промежуточные длины строк.

Это должно иметь лучшую производительность, чем row_number(), потому что он не присваивает номер строки каждомустрока, только тогда, чтобы отфильтровать вещи.

0 голосов
/ 27 января 2019

Предложение order by во внутреннем выборе является избыточным, поскольку оно используется в качестве таблицы, а таблицы в реляционной базе данных неупорядочены по своей природе.
Хотя другие базы данных, такие как SQL Server, будут обрабатываться как ошибка,Я думаю, MySql просто игнорирует это.

Я думаю, что вы ищете что-то вроде этого:

SELECT text, can_id
FROM comments
ORDER BY id DESC
LIMIT 1

Таким образом, вы получите текст и can_id, ассоциированные с наибольшим значением идентификатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...