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: 28716

