LINUX.ORG.RU

Сообщения outtaspace

 

Неконсистентность запроса с group by + order by + limit

Столкнулся с необъяснимым поведением mysql 5.7 (разумеется под онтопиком).

В запросах нет хранимок, вьюшек, агрегатных функций и прочих сложностей. Таблица table_name статична, данные в ней не меняются. Запросы 1 и 2 отличаются только циферкой - лимитом, т.е. последим символом запроса.

Насколько я понимаю последовательность выполнения конкретного запроса (group by + order by + limit), mysql должен вычислить limit по уже отфильтрованным и отсортированным строкам. То есть при любом запросе вернет одинаковый результат - единственную строку подходящую под condition. Но практике это не так.

Запрос 1 использует лимит=1, возвращает 0 строк. Хотя запрос должен вернуть одну строку, таков condition и набор данных в таблице.

select
    tn.id
from
    table_name as tn
where
    condition
group by
    tn.id
order by
    tn.id
limit 1

Запрос 2 использует лимит=2, возвращает 1 строку. Именно одну строку этот запрос и должен извлечь, таков condition и набор данных в таблице.

select
    tn.id
from
    table_name as tn
where
    condition
group by
    tn.id
order by
    tn.id
limit 2

 , ,

outtaspace ()

Ищу работу: Perl, Киев.

С 2007 года работаю в Perl-проектах: телеком, автоматизация тестирования, web, поисковики.

 

outtaspace ()

Angularjs, не обновляется view при обновлениях страницы.

Страница загружается ajax'ом.

При первоначальной загрузке отрабатывает как надо (бутстрапится ангуляр, по таймауту обновляется сообщение внутри div'а).

Но если уйти в другой таб и вернуться, не генерится view: вместо сообщения (message из $scope) вижу placeholder:

{{message}}

Решил форсировать, через $scope.$apply(), но оно не работает как надо, сообщение в div'е не обновляется.

Как починить? Мб я где-то грубо ошибся?

<div id="hello" ng-controller="MyController">
message: {{message}}
</div>

<script>
angular.module('myApp', [])
    .controller('MyController', ['$scope', function($scope) {
        $scope.message = "Waiting 2000ms for update.";

        setTimeout(function () {
            $scope.$apply(function () {
                $scope.message = "Timeout called!";
            });
        }, 2000);
    }]);

angular.element(document).ready(function() {
    try {
        console.log('Bootstrap!');
        angular.bootstrap(document, ['myApp']);
    } catch(err) {
        console.log('Already bootstrapped!');

        var $scope = angular
            .element(document.getElementById('hello'))
            .scope();

        setTimeout(function () {
            $scope.$apply(function () {
                $scope.message = "Timeout called!";
            });
        }, 2000);
    }
});
</script>

 

outtaspace ()

RSS подписка на новые темы