Kurs opisuje zagadnienie dość skomplikowanego sortowania wyników z bazy danych.
Nasze zadanie polega na wyświetleniu 4 osób o grupie gwiazda na stronie głównej według takiej zasady:
- najpierw losowo osoby online
- następnie osoby które zadeklarowały że będą online ale nie później niż za 12 godzin
- cała reszta losowo
Nasze tabele:
użytkownicy: id, username, grupa
online: username, data
bede_za: username, data
Rozwiązanie:
a.id, a.username, a.grupa,
c.DATA AS online,
e.DATA AS za, e.DATA IS NULL AS isnull
FROM
star_users AS a LEFT JOIN star_online AS c ON b.username=c.username
LEFT JOIN star_bede_online AS e ON b.username=e.username
WHERE a.grupa='star' AND
NOW() + interval 12 hour > CASE WHEN e.DATA IS NULL THEN '0000-00-00 00:00:00' ELSE e.DATA END
GROUP BY (a.username) ORDER BY online DESC, isnull ASC, za ASC, RAND() LIMIT 4
Co się wydarzyło?
1. a.id, a.username, a.grupa - to nasze dane usera
2. c.DATA AS online - przypisanie wartości c.data do zmiennej online łatwijszej dla oka
3. e.DATA AS za - przypisanie wartości e.data do zmiennej za łatwijszej dla oka
4. e.DATA IS NULL AS isnull - jeśli wartość e.data jest NULL to przypisujemy zmiennej isnull wartosc 1, po co? bo potem jak będziemy robić order by ASC to nule weszły by nam na samą góre wyników
5. potem mamy left join
6. NOW() + interval 12 hour > CASE WHEN e.DATA IS NULL THEN '0000-00-00 00:00:00' ELSE e.DATA END - to użyte w klauzuli where wyodrębni nam osoby który zapowiedziały ze będą online za do 12h
7. GROUP BY (a.username)- grupowanie wyników po loginie aby sie wartości nie powtarzały
8. ORDER BY online DESC, isnull ASC, za ASC, RAND() - w tym momencie wykonujemy ORDER BY według naszy kryteriów założonych w zleceniu czyli najpierw ludzie online, potem ci bedę online za i na końcu cała reszta
Listing
Ranga: Administrator serwisu Punktów: 0