Отсортировано поле rev в обратном порядке, а затем сгруппировано по идентификатору, который дал первую строку каждой группы, которая является самой высокой величиной rev.
SELECT * FROM (SELECT * FROM table1 ORDER BY id, rev DESC) X GROUP BY X.id;
Проверено в http: //sqlfiddle.com/ со следующими данными
CREATE TABLE table1
(`id` int, `rev` int, `content` varchar(11));
INSERT INTO table1
(`id`, `rev`, `content`)
VALUES
(1, 1, 'One-One'),
(1, 2, 'One-Two'),
(2, 1, 'Two-One'),
(2, 2, 'Two-Two'),
(3, 2, 'Three-Two'),
(3, 1, 'Three-One'),
(3, 3, 'Three-Three')
;
Это дало следующий результат в MySql 5.5 и 5.6
id rev content
1 2 One-Two
2 2 Two-Two
3 3 Three-Two
Чтобы сделать пользовательский интерфейс более отзывчивым, вы должны отправить себе сообщение (Control.BeginInvoke
), сделать одну операцию, отправить себе другое сообщение. Затем каждый раз, когда вы делаете что-либо, следующий шаг будет поставлен в очередь после всех пользовательских сообщений, поэтому действия пользователя будут обработаны в кратчайшие сроки.
Один действительно отличный подход - использовать yield return
и позволить компилятору позаботиться о все логики замыканий:
IEnumerable AsyncLoadUI()
{
var p = new Panel();
Controls.Add(p);
yield return null;
for( int i = 0; i < 50; ++i ) {
var txt = new TextBox();
p.Controls.Add(txt);
yield return null;
}
}
override void OnLoad(EventArgs e)
{
IEnumerator tasks = AsyncLoadUI().GetEnumerator();
MethodInvoker msg = null;
msg = delegate { if (tasks.MoveNext()) BeginInvoke(msg); };
msg();
}
Взгляните на мое решение, предлагаемое другому . У них была очень похожая проблема. Подождите, пока все закончит свою загрузку, прежде чем делать какое-то действие, но не каждый раз, когда форма обязательно становится «активирована» или «показана». Это связано с привязкой к Load loader вашего внешнего контроля интереса. В вашем случае, с вкладкой страницы, но пример решения я представил был на уровне FORM.
Если при загрузке этого списка происходит небольшая задержка, то выполнение этой нагрузки в потоке пользовательского интерфейса всегда сделает форму невосприимчивой независимо от того, какое событие вы ее выполняете, - чтобы это было сделано после того, как форма загрузилась, тогда она будет просто сделать форму незащищенной и видимой, а не просто вызвать задержку до отображения формы.
Если нет возможности ускорить загрузку списка, вам, вероятно, потребуется изменить логику загрузки формы так что «тяжелый подъем» вместо этого выполняется в фоновом потоке, чтобы форма оставалась отзывчивой во время заполнения списка. Вы должны знать, что многопоточный код сложнее понять, а когда он некорректно может создавать ошибки, которые прерывисты и сложны для отладки, и поэтому вы должны сначала попытаться ускорить свой существующий код. Тем не менее, если вы не можете ускорить загрузку своего списка, а задержка неприемлема, тогда альтернативы не существует.
Если вы предпочитаете загружать свой список асинхронно (в фоновом потоке), тогда идея чтобы начать фоновый поток (обычно с помощью BackgroundWorker ), который выполняет тяжелую работу по подготовке списка добавляемых элементов - когда это закончится (или не удалось), поле формы / списка обновляется с помощью предоставленный список элементов.
Вы должны быть в состоянии найти множество ресурсов о том, как это сделать в Интернете, которые будут охватывать это более подробно.