Skocz do zawartości

Mysql - losowe wybieranie rekordów


wrednotka

Rekomendowane odpowiedzi

Mam pytanko. Jak stworzyć zapytanie w SQL-u aby pobierało losowo rekordy ale najczęściej losowało te rekordy, które mają największe wartości w danej kolumnie.

Np. mając tabele "pracownicy":

pracownik_id | nazwisko | wyplata

Aby wylosować losowo 10 pracowników wklepujemy:

SELECT * FROM pracownicy ORDER BY RAND() LIMIT 10.

Jak napisac zapytanie aby losował najczęściej tych pracowników, którzy mają najwieksze wypłaty?

W PHP można wprowadzić np. 20 wylosowanych pracowików do tablicy, posegregować wg wielkości wypłaty i z tego wybrać 10. Jednak czy ktoś wie jak to zrobic wykorzystując tylko SQL'a?

Odnośnik do komentarza
Udostępnij na innych stronach

spróbuj tak: SELECT * FROM (SELECT * FROM pracownicy ORDER BY wyplata DESC LIMIT 10) AS wyplaty ORDER BY RAND()

wewnętrzny select da ci 10 najwyższych wypłat, a potem z tego zbioru robisz select i losowo przestawiasz mu wyniki randem :)

Kup sobie nieruchomości Kraków albo apartamenty Zakopane. Obejrzyj też fotoblog Grzegorza Ziemiańskiego Nowa Huta na deser

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki bardzo. To mnie też czegoś nauczyło, ale nie dokładnie o to mi chodziło. Chodzi mi oto aby NAJCZĘŚCIEJ losował tych pracowników, którzy mają największe wypłaty A NIE TYLKO Z PIERWSZEJ DZIESIĄTKI! Zastanawiam się czy w ogóle to się da zrobić w SQL-u i czy jest sens to robić tylko w nim. Z użyciem PHP bez problemu dałoby się to zrobić tylko czy nie szybciej by było zrobić to od razu w SQL-u. Skrypt będzie docelowo bardzo mocno obciążony.

Odnośnik do komentarza
Udostępnij na innych stronach

Zastanawiam się czy w ogóle to się da zrobić w SQL-u

Jasne, że się da - tylko troszkę obciąży SQL'a no chyba, że tabela nie jest za wielka do kilku tyś.pozycji

SELECT * FROM pracownicy order by rand()*wyplata desc Limit 10

Poroblem co do oceny skuteczności roziwązania jest taki, że nie znam rozpiętości cen i ilości pracowników

przy dużej rozpiętości cen i dużej ilości pracowników szansa wylosowanie kogoś z końca jest minimalna.

bo zawsze wśród 100 z dużymi wypłatami znajdzie się 10-ciu z dobra liczbą w losowaniu.

Jak to poprawić ? - należało by dobrać doświadczalnie współcznynnik zmniejszający znaczenie pensji a zwiekszający wylosowanej liczby.

nieźle sprawdza się schemat:

SELECT * FROM pracownicy order by rand()*WS+wyplata desc Limit 10

gdzie współczynnik WS to średnia pensja pomnozona 20 razy - zmieniając wagę współczynnika WS można sterować statystyczną ilością wypadających pracowników z dużymi pensjam. Współczynnik WS nie powinien być mniejszy niż 2 krotna wartość najwyższej pensji gdyż inaczej gościu z maksem byłby losowany prawie zawsze.

Odnośnik do komentarza
Udostępnij na innych stronach

MAX BIG dzięki MRTN !! Nawet nie spodziawałem sie ze to takie proste! :)

Gdzie sie tego nauczyłeś? Ja szukałam tego w manualu ale nie znalazłam. Masz może namiary na jakiś dobry kurs (my)sql'a, czy książkę? :P

A co do skryptu to ta tabelka 'pracownicy' jest fikcyjna. Skrypt, w którym będzie to zapytanie będzie bardzo obciążony bo wiele operacji na kilku tabelach (gdzie niektóre będą stale zwiększane) będzie wykonywanych.

Jeszcze raz dzięki :)

Odnośnik do komentarza
Udostępnij na innych stronach

MMP nie przesadzajmy to elemnty rachunku prawdopodobieństwa - czyli jednak gdzieś łatwiejsze lekcje ze szkoły średniej - no cóż ale co robić jak matematyki nie ma na maturze.

Uważam, że program matematyki powinien być kilkukrotnie odchudzony .... ale w zamian za to na egzaminie wymagane by było pełnie zrozumienie tamtu. A tak sprzedają się systemy do gry w tootolotka, zerowe kredyty. A na studiach technicznych (na szczęście na początku) stydenci nie potrafią rzowiązać zadania z dwiema niewiadomymi.

P.S. Wracjac do tego zadania studentów to w zasadzie rozwiązać potrafią, ale nie potrafią go ułożyć - po prostu jest zadanie z "z zyćia wzięte" i trzeba trochę pomyśleć.

Odnośnik do komentarza
Udostępnij na innych stronach

MMP nie przesadzajmy to elemnty rachunku prawdopodobieństwa - czyli jednak gdzieś łatwiejsze lekcje ze szkoły średniej

Ja jednak obstawiam za SP bo wtedy się uczymy mnożyć a chyba większość z nasz wpadnie by Element losowy * Element stały :D

Co do matury z matmy, to prawdopodobnie znowu ją chcą wprowadzić i niestety ja chyba będe należeć do rocznika który będzie musiał pisać, ehh :/

stopka usunieta z wpoodu wirusa na stronie docelowej

Odnośnik do komentarza
Udostępnij na innych stronach

ale bardziej przydatne jest to z waga (współczynnikiem) a to już nie jest takie oczywiste dla niektórych.

Dla bawiacych się w losowanie.

Pytanie: jak zrobić, żeby losowanie było nie równomierne - np.: liczby bardzo wyooskie i bardzo niskie wypadały rzadziej niż "zwykłe".

Odpowiedź: np: rand()*rand()

przypomina to trochę rzut dwiema kostkami których suma to najcześciej 7.

proste, ale umożliwia bardzo specyficzne zabawy ;-)

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności