eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › losowy rekord w sqlu
Ilość wypowiedzi w tym wątku: 17

  • 1. Data: 2012-04-21 16:08:58
    Temat: losowy rekord w sqlu
    Od: "M.M." <m...@W...gazeta.pl>

    Hey

    Moje pytanie jest proste. Jak efektywnie wybrać losowy
    rekord (ewentualnie kilka losowych) dużej tabeli w sqlu?

    Sztuczki tego typu:
    SELECT * FROM table ORDER BY rand LIMIT kilka
    zdaje się że przeglądają całą tabelę, a to jest niedopuszczalne.

    Pozdrawiam


    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/


  • 2. Data: 2012-04-21 17:58:11
    Temat: Re: losowy rekord w sqlu
    Od: Michoo <m...@v...pl>

    On 21.04.2012 16:08, M.M. wrote:
    > Hey
    >
    > Moje pytanie jest proste. Jak efektywnie wybrać losowy
    > rekord (ewentualnie kilka losowych) dużej tabeli w sqlu?
    >
    > Sztuczki tego typu:
    > SELECT * FROM table ORDER BY rand LIMIT kilka
    > zdaje się że przeglądają całą tabelę, a to jest niedopuszczalne.
    >
    Wylosować kilka wartości klucza?

    --
    Pozdrawiam
    Michoo


  • 3. Data: 2012-04-21 19:55:09
    Temat: Re: losowy rekord w sqlu
    Od: " M.M." <m...@N...gazeta.pl>

    Michoo <m...@v...pl> napisał(a):

    > On 21.04.2012 16:08, M.M. wrote:
    > > Hey
    > >
    > > Moje pytanie jest proste. Jak efektywnie wybrać losowy
    > > rekord (ewentualnie kilka losowych) dużej tabeli w sqlu?
    > >
    > > Sztuczki tego typu:
    > > SELECT * FROM table ORDER BY rand LIMIT kilka
    > > zdaje się że przeglądają całą tabelę, a to jest niedopuszczalne.
    > >
    > Wylosować kilka wartości klucza?
    Tak się nie da, ale podsunąłeś mi inny pomysł. Osobne pole które
    będzie miało wszystkie wartości od 1 do N gdzie N to ilość rekordów
    w tabeli. Przy usuwaniu rekordu zastąpię maxa usuwanym polem.
    Pozdrawiam


    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/


  • 4. Data: 2012-04-23 13:50:22
    Temat: Re: losowy rekord w sqlu
    Od: Michoo <m...@v...pl>

    On 21.04.2012 19:55, M.M. wrote:
    > Michoo<m...@v...pl> napisał(a):
    >> Wylosować kilka wartości klucza?
    > Tak się nie da, ale podsunąłeś mi inny pomysł. Osobne pole które
    > będzie miało wszystkie wartości od 1 do N gdzie N to ilość rekordów
    > w tabeli. Przy usuwaniu rekordu zastąpię maxa usuwanym polem.
    Pamiętaj o indeksie ;)

    I w sytuacji gdy masz np jakieś triggery na modyfikacji rekordu pomyśl,
    czy nie warto dać tej relacji do osobnej tabelki.

    --
    Pozdrawiam
    Michoo


  • 5. Data: 2012-04-23 16:17:54
    Temat: Re: losowy rekord w sqlu
    Od: " M.M." <m...@N...gazeta.pl>

    Michoo <m...@v...pl> napisał(a):

    > On 21.04.2012 19:55, M.M. wrote:
    > > Michoo<m...@v...pl> napisał(a):
    > >> Wylosować kilka wartości klucza?
    > > Tak się nie da, ale podsunąłeś mi inny pomysł. Osobne pole które
    > > będzie miało wszystkie wartości od 1 do N gdzie N to ilość rekordów
    > > w tabeli. Przy usuwaniu rekordu zastąpię maxa usuwanym polem.
    > Pamiętaj o indeksie ;)
    Bez indeksu zdaje się że średnio by musiał przeszukać 50% rekordów :)

    > I w sytuacji gdy masz np jakieś triggery na modyfikacji rekordu pomyśl,
    > czy nie warto dać tej relacji do osobnej tabelki.
    Pomyślałem i okazało się że mój problem jest cięższy niż początkowo
    sądziłem. Czasami będę potrzebował losowy rekord ze złączenia
    trzech tabel:

    Tabele TA,TB,TC. TB łączy tabelę TA z tabelą TC.
    Czyli losowy rekord z tego co zwraca poniższe zapytanie:

    SELECT TC.dane FROM
    TA
    JOIN
    TB
    ON
    TA.id = TB.id_a
    JOINT
    TC
    ON
    TC.id = TB.id_c
    WHERE
    TA.dane = cos_1 AND TA.dane = cos_2 AND ...

    Mam nadzieję że się nie rypłem w zapytaniu :)
    Pozdrawiam





    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/


  • 6. Data: 2012-04-23 16:23:09
    Temat: Re: losowy rekord w sqlu
    Od: "AK" <n...@n...com>

    Użytkownik "M.M." <m...@W...gazeta.pl> napisał:
    w wiadomości news:jmuf1p$rlf$1@inews.gazeta.pl...

    > Moje pytanie jest proste. Jak efektywnie wybrać losowy
    > rekord (ewentualnie kilka losowych) dużej tabeli w sqlu?

    Okularnik poleca m.in. cos takiego:
    http://www.petefreitag.com/item/466.cfm

    AK


  • 7. Data: 2012-04-23 16:35:06
    Temat: Re: losowy rekord w sqlu
    Od: " M.M." <m...@N...gazeta.pl>

    M.M. <m...@N...gazeta.pl> napisał(a):

    > Mam nadzieję że się nie rypłem w zapytaniu :)
    Jednak się rypłem... jeszcze trudniejsze jest.

    SELECT
    TC.dane
    FROM
    TC AS TC_1
    WHERE
    N =
    (
    SELECT COUNT(*) FROM
    TA
    JOIN
    TB
    ON
    TA.id = TB.id_a
    JOIN
    TC AS TC_2
    ON
    TC_2.id = TB.id_c
    WHERE
    TC_2.id = TC_1.id
    AND
    ( TA.dane = cos_1 OR TA.dane = cos_2 OR ... OR TA.dane = cos_N )
    )

    Teraz chyba dobrze :)
    I z wyników zapytania muszę mieć losowy rekord.
    Pozdrawiam



    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/


  • 8. Data: 2012-04-23 16:38:19
    Temat: Re: losowy rekord w sqlu
    Od: " M.M." <m...@N...gazeta.pl>

    AK <n...@n...com> napisał(a):

    > Użytkownik "M.M." <m...@W...gazeta.pl> napisał:
    > w wiadomości news:jmuf1p$rlf$1@inews.gazeta.pl...
    >
    > > Moje pytanie jest proste. Jak efektywnie wybrać losowy
    > > rekord (ewentualnie kilka losowych) dużej tabeli w sqlu?
    >
    > Okularnik poleca m.in. cos takiego:
    > http://www.petefreitag.com/item/466.cfm

    No tak, dotarłem do tego, ale zdaje się że to zapytanie
    jeździ po całej tabeli?
    SELECT column FROM table ORDER BY RANDOM() LIMIT 1
    Pozdrawiam





    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/


  • 9. Data: 2012-04-23 16:50:57
    Temat: Re: losowy rekord w sqlu
    Od: " M.M." <m...@N...gazeta.pl>

    M.M. <m...@N...gazeta.pl> napisał(a):

    > AK <n...@n...com> napisał(a):
    >
    > > Użytkownik "M.M." <m...@W...gazeta.pl> napisał:
    > > w wiadomości news:jmuf1p$rlf$1@inews.gazeta.pl...
    > >
    > > > Moje pytanie jest proste. Jak efektywnie wybrać losowy
    > > > rekord (ewentualnie kilka losowych) dużej tabeli w sqlu?
    > >
    > > Okularnik poleca m.in. cos takiego:
    > > http://www.petefreitag.com/item/466.cfm
    >
    > No tak, dotarłem do tego, ale zdaje się że to zapytanie
    > jeździ po całej tabeli?
    > SELECT column FROM table ORDER BY RANDOM() LIMIT 1
    > Pozdrawiam

    Za to takie zapytanie wydaje się ciekawe:
    SELECT * FROM table OFFSET RANDOM() LIMIT 1;
    Pytanie tylko czy bazy potrafią skoczyć szybko pod N-ty rekord.
    Bez sortowania powinny z łatwością potrafić.
    Pozdrawiam


    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/


  • 10. Data: 2012-04-23 16:54:03
    Temat: Re: losowy rekord w sqlu
    Od: "AK" <n...@n...com>

    Użytkownik " M.M." <m...@N...gazeta.pl> napisał:

    > No tak, dotarłem do tego, ale zdaje się że to zapytanie
    > jeździ po całej tabeli?
    > SELECT column FROM table ORDER BY RANDOM() LIMIT 1

    "Teoretycznie" wcale nie musi.
    Wydaje mi sie, ze wystarczy ze RANDOM() policzy m = MAX("row_id"), wylosuje x =
    irand(0, m)
    i znajdzie row z row_id >= x lub row_id <= x. Wszytsko dzieje sie wiec po indeksie
    (glownym).
    Wszytsko zalezy od optymalizatora.
    PS: Fakt, ze w przypadku duzej ilosci "dlugich" dziur bedzie to odbiegac od rozkladu
    jednostajnego
    ale.. no na tyle to sie nie znam na SQL zeby _cokolwiek_ wiecej moc powiedziec poza
    przypuszczeniami.

    AK

strony : [ 1 ] . 2


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: