LIMIT w MSSQL

Jest takie coś w MySQL do czego Microsoft jeszcze nie dojrzał i nie wiadomo czy w ogóle dojrzeje. A mianowicie LIMIT – element zapytania pozwalający na wyświetlenie X rekordów od rekordu Y począwszy. To cudo jest odporne na sortowanie, warunki, joiny itd. Idealna sprawa do stronicowania.

Przykładowe zapytanie w MySQL:

 

$mysql = "SELECT * FROM lista ORDER BY id LIMIT 5,10"

pokaż 5 rekordów z listy począwszy od 10 pozycji.

W MSSQL osiągnąć podobny efekt można stosując taką sztuczkę:

 

$mssql = "SELECT TOP 5 * FROM lista WHERE id NOT IN (SELECT TOP 10 id FROM lista ORDER BY id) ORDER BY id"

pokaż pięć rekordów z listy, zakładając że ich id nie ma wśród 10 poprzednich id.
Tia… no nieważne jak to sobie wytłumaczymy – to działa.

Problem zaczyna się gdy do stronicowania chcemy dodać sortowanie. Należy wówczas pamiętać że ten kawałek kodu w nawiasie „SELECT TOP 10 id…” musi się zmieniać. I tak jeśli sortujemy względem „id” – jest ok, ale jeśli sortujemy względem np. nazwiska, zapytanie przyjmie taką postać:

 

$mssql = "SELECT TOP 5 FROM lista WHERE nazwisko NOT IN (SELECT TOP 10 nazwisko FROM lista ORDER BY nazwisko) ORDER BY nazwisko"

Na deser polecam pamiętać, że dodawanie do takiego cudaka warunku „where” zadziała tylko wtedy gdy dodamy go do obu selectów, również do tego w nawiasie.

4 thoughts on “LIMIT w MSSQL

  1. Słabe rozwiązanie. A co jak nie będziesz miał unikatowych kolumn, albo jak będziesz pobierać zbiorcze dane (COUNT, SUM, AVG) i do tego jeszcze dodać grupowanie?

  2. Nie twierdzę, że to najlepsze rozwiązanie na świecie. Ale w moim przypadku zadziałało, postanowiłem się podzielić tą informacją. Guru MSSQL nie jestem, dlatego mogłem sobie jedynie pozwolić na dedukcję na podstawie informacji z innych stron. I wyszło mi to co powyżej.
    Jak tylko zdarzy się, że będzie potrzebne bardziej wyszukane rozwiązanie i go znajdę, z pewnością go tu umieszczę. Pozdr.

  3. Masz błąd w zapisie. Napisałeś tak: LIMIT 5,10 pokaż 5 rekordów z listy począwszy od 10 pozycji.

    LIMIT 5, 10 pokazuje dziesięć rekordów począwszy od 6 pozycji dlatego, że rekordy numerowane są od zera. Czyli jakbyś miał kolumnę z ID (auto increment) miałbyś strony od 6 do 15.

Comments are closed.