Arriss
26.04.2010, 09:43:07
Ciezko bylo mi nawet zatytulowac temat. Potrzebuje zapytania ktore pokaze mi powiedzmy 20 osob z najwieksza iloscia punktow o statusie 1 ale jesli w meidzyczasie bedzie ktos o statusie 0 rowniez wyswietli. Limit ma sie konczyc na 20 osobie o statusie 1. Czyli jesli w srodku bedzie 5 osob o statusie 0 to wyswietli 25 wpisow. Wiem ze zagmatwane. Dziekuje za wszystkie porady i naprowadzenia. Nie pogardzilbym przykladowym zapytaniem.
wookieb
26.04.2010, 10:06:11
To podaj strukture tabeli i przykładowe dane. Najlepiej w formie zapytania i wyjaśnij co to znaczy "w międzyczasie" bo nie wyraziłeś się dostatecznie jasno.
Arriss
26.04.2010, 10:29:19
SELECT * FROM tabela WHERE ranking<>'0' AND stat='1' ORDER BY ranking DESC LIMIT 20
wyswietli mi 20 pierwszysch osob w rankinu
jednak mam tez ludzi ktorzy maja stat=0 i chce ich tez pokazac w rankingu jednak chce zeby ranking konczyl sie na 20 osobie o satusie 1 niezaleznie ile osob o statusie 0 ma wiecej punktow w rankingu.
Dam przyklad
1 user 1 status 1
2 user 2 status 1
.....
20 user20 status 1
a chce
1 user 1 status 1
2 user 2 status 0
.....
5 user 5 status 0
...
20 user20 status 1
21 userx status 1
22 usern status 1
chodzi mi zeby ranking konczyl sie na 20 osobie o danym statusie niezaleznie ile podrodze wyswietli osob o innym statusie.
Mchl
26.04.2010, 10:32:02
Kod
(SELECT 20 osób ze statusem 1)
UNION
(SELECT osoby ze statusem 0)
Arriss
26.04.2010, 10:56:51
Próbowalem i wyswietlilo mi cos typu
1 user stat 1
2 user stat 1
20 user stat 1
1 users stat0
2 user stat 0
20 users stat 0
czyli lacznie wyswietlio mi 40 osob nieposortowanych
Mchl
26.04.2010, 11:34:20
I nie dasz rady dodać sortowania?
Kod
SELECT * FROM
(SELECT 20 osób ze statusem 1)
UNION
(SELECT osoby ze statusem 0)
ORDER BY...
phpion
26.04.2010, 11:53:13
@Mchl:
Chyba źle zrozumiałeś problem. Nie jest on tak banalny jak się z pozoru wydaje. Zapewne chodzi o coś takiego (zamiast 20 przyjmuję 3 wpisy do pokazania):
Wariant A:
id | status
1 | 1
2 | 1
3 | 1
Wariant B:
id | status
1 | 1
4 | 0
2 | 1
3 | 1
Po drodze wskakuje użytkownik o statusie 0, jednak w wyniku nadal mamy 3 rekordy ze statusem 1 (a tych ze statusem 0 jest tyle, ile jest ich "po środku").
Arriss
26.04.2010, 14:38:36
Dokladnie o to chodzi. Najtrudniej jest wytlumaczyc innym o co chodzi
Mchl
26.04.2010, 19:23:15
I sortowanie jest po jakowymś polu zwanym ranking, jak rozumiem?
To może tak?
Kod
(SELECT ... FROM tabela WHERE status = 1 ORDER BY ranking DESC LIMIT 20)
UNION
(SELECT ... FROM tabela AS t1 INNER JOIN (SELECT ... FROM tabela WHERE status = 1 ORDER BY ranking DESC LIMIT 19,1) AS t2 ON t1.ranking <= t2.ranking WHERE status =0 ORDER BY ranking DESC)
Arriss
27.04.2010, 15:39:42
Cos nie dzialalo mi to zapytanie. Po ponownym przemysleniu postawnowilem liczyc ludzi z odpowiednim statusem a pozniej dac ifa i jesli jest wiecej to break; i po sprawie. Dzieki wszystkim za pomoc.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.