Loading:

PHP 7 News & Updates v7.0 - 7.4 - book

MySQL sortowanie losowe według 3 kolumn klauzula WHERE CASE WHEN

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



Napisz Artykuł

Listing

niema


Ten wpis posiada swój wątek na forum

Wszystkie pytania prosimy kierować właśnie tam ponieważ komentarze to miejsce na poprawki do kodu lub alternatywne rozwiązania i pytania nie będą publikowane

http://forum.funkcje.net/forum/viewtopic.php?f=4&t=5446

Dane do logowania na forum są takie same jak na funkcje.net



Dodano przez: igor
Ranga: Administrator serwisu Punktów: 28716
Komentarze użytkowników
    • Treść komentarza
      Kod do komentarza (opcjonalnie)
      PHP JavaScript MySQL Smarty SQL HTML CSS ActionScript
      Autor
      Token
      token

       

       








funkcje.net
Wszelkie prawa zastrzeżone©. | Funkcje.net 2008-17 v.1.5 | design: diviXdesign & rainbowcolors