Получение самых последних записей в запросе

Попробуйте следующее. Где бы вы не создавали экземпляр своего экземпляра WKWebView, добавьте что-то похожее на следующее:

    //Javascript string
    NSString * source = @"window.webkit.messageHandlers.sizeNotification.postMessage({width: document.width, height: document.height});";

    //UserScript object
    WKUserScript * script = [[WKUserScript alloc] initWithSource:source injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];

    //Content Controller object
    WKUserContentController * controller = [[WKUserContentController alloc] init];

    //Add script to controller
    [controller addUserScript:script];

    //Add message handler reference
    [controller addScriptMessageHandler:self name:@"sizeNotification"];

    //Create configuration
    WKWebViewConfiguration * configuration = [[WKWebViewConfiguration alloc] init];

    //Add controller to configuration
    configuration.userContentController = controller;

    //Use whatever you require for WKWebView frame
    CGRect frame = CGRectMake(...?);

    //Create your WKWebView instance with the configuration
    WKWebView * webView = [[WKWebView alloc] initWithFrame:frame configuration:configuration];

    //Assign delegate if necessary
    webView.navigationDelegate = self;

    //Load html
    [webView loadHTMLString:@"some html ..." baseURL:[[NSBundle mainBundle] bundleURL]];

Затем добавьте метод, аналогичный следующему, к которому когда-либо класс подчиняется протоколу WKScriptMessageHandler для обработки сообщения:

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
    CGRect frame = message.webView.frame;
    frame.size.height = [[message.body valueForKey:@"height"] floatValue];
    message.webView.frame = frame;}

Это работает для меня.

Если у вас больше текста в документе, вам может понадобиться обернуть javascript, чтобы он был загружен:

@"window.onload=function () { window.webkit.messageHandlers.sizeNotification.postMessage({width: document.width, height: document.height});};"

ПРИМЕЧАНИЕ. Это решение не рассматривает текущие обновления документа.

13
задан Bill Karwin 12 January 2013 в 05:59
поделиться

3 ответа

MySQL не имеет функциональности ранжирования/анализа/окон.

SELECT tl.locationid, tl.timestamp, tp.name, X, Y, Z
  FROM tblPerson tp
  JOIN tblLocation tl ON tl.personid = tp.personid
  JOIN (SELECT t.personid,
               MAX(t.timestamp) AS max_date
          FROM tblLocation t
      GROUP BY t.personid) x ON x.personid = tl.personid
                            AND x.max_date = tl.timestamp

SQL Server 2005+ и Oracle 9i+ поддерживают аналитику, поэтому вы можете использовать:

SELECT x.locationid, x.timestamp, x.name, x.X, x.Y, x.Z
  FROM (SELECT tl.locationid, tl.timestamp, tp.name, X, Y, Z,
               ROW_NUMBER() OVER (PARTITION BY tp.name ORDER BY tl.timestamp DESC) AS rank
          FROM tblPerson tp
          JOIN tblLocation tl ON tl.personid = tp.personid) x
WHERE x.rank = 1

Использование переменной для получения того же, что и функциональность ROW_NUMBER в MySQL:

SELECT x.locationid, x.timestamp, x.name, x.X, x.Y, x.Z
  FROM (SELECT tl.locationid, tl.timestamp, tp.name, X, Y, Z,
               CASE
                 WHEN @name != t.name THEN
                   @rownum := 1
                 ELSE @rownum := @rownum + 1
               END AS rank,
               @name := tp.name
          FROM tblLocation tl
          JOIN tblPerson tp ON tp.personid = tl.personid
          JOIN (SELECT @rownum := NULL, @name := '') r
      ORDER BY tp.name, tl.timestamp DESC) x
WHERE x.rank = 1
26
ответ дан 1 December 2019 в 08:15
поделиться

Это классический вопрос 'max per group', который появляется на Stack Overflow почти каждый день. Существует множество способов его решения, и вы можете найти примеры решений, поискав в Stack Overflow. Вот один из способов, который вы можете сделать в MySQL:

SELECT
    location.LocationId,
    location.Timestamp,
    person.Name,
    location.X,
    location.Y,
    location.Z
FROM (
    SELECT
        LocationID,
        @rn := CASE WHEN @prev_PersonID = PersonID
                    THEN @rn + 1
                    ELSE 1
               END AS rn,
        @prev_PersonID := PersonID
    FROM (SELECT @prev_PersonID := NULL) vars, tblLocation
    ORDER BY PersonID, Timestamp DESC
) T1
JOIN tblLocation location ON location.LocationID = T1.LocationId
JOIN tblPerson person ON person.PersonID = location.PersonID
WHERE rn = 1
3
ответ дан 1 December 2019 в 08:15
поделиться

Как упоминает @Mark Byers, эта проблема часто возникает на Stack Overflow.

Вот решение, которое я чаще всего рекомендую, учитывая ваши таблицы:

SELECT p.*, l1.*
FROM tblPerson p
JOIN tblLocation l1 ON p.PersonID = l1.PersonID
LEFT OUTER JOIN tblLocation l2 ON p.PersonID = l2.PersonID AND 
  (l1.timestamp < l2.timestamp OR l1.timestamp = l2.timestamp AND l1.LocationId < l2.LocationId)
WHERE l2.LocationID IS NULL;

Чтобы увидеть другие примеры, следуйте тегу greatest-n-per-group, который я добавил к вашему вопросу.

4
ответ дан 1 December 2019 в 08:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: