Daniel Wojciechowski

Daniel Wojciechowski Skład DTP, Grafik,
Nowe 7 Dni Gryfina

Temat: Ranking - rownumber i błąd w składni

Witam. Mam proste pobranie kilku kolumn z kilku dołączonych tabel i wyselekcjonowanie wyników po id.

SET @rownum := '0';
SELECT rank, ile, CONCAT(imie,' ',nazwisko) AS uzytkownik, CONCAT(miasto,' ',wojewodztwo) AS miejscowosc, autor
FROM (SELECT @rownum := @rownum + 1 AS rank, COUNT(autor) AS ile, u.imie AS imie, u.nazwisko AS nazwisko, m.miasto as miasto, m.wojewodztwo AS wojewodztwo, t.autor AS autor
FROM ncpp_tematy t
LEFT JOIN ncpp_uzytkownicy u ON(t.autor = u.id)
LEFT JOIN ncpp_miasta m ON (u.miasto = m.id)
GROUP BY t.autor
ORDER BY ile DESC) AS result WHERE autor=1


Kod testowałem w PHPMyAdminie i śmiga, z kolei gdy juz robi to PHP to wyskakuje mi taki błąd:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT rank, autor FROM (SELECT @rownum := @rownum + 1 AS rank, autor ' at line 2


czyli błąd składni. Szukam szukam, zmieniam apostrofy, średniki, wszystko i nic. Podpowiecie, gdzie dziad siedzi?

konto usunięte

Temat: Ranking - rownumber i błąd w składni

Wsadź to w procedure i w php wywołaj ją.
Marcin Miga

Marcin Miga Programista. Po
prostu programista.

Temat: Ranking - rownumber i błąd w składni

PHP wyraźnie pokazuje gdzie masz błąd... Przed SELECT. Czyli nie dopuszcza wielu komend rozdzielonych ;
Możesz to obejść na kilka sposobów:
- wymieniona już wcześniej procedura
- zmiana SQL-a, tak by nie zawierała SET... np. SELECT ... FROM @rownum := Coalesce(@rownum,0) + 1 AS rank, ...

Poza tym ustawiałeś tej zmiennej wartość string (jakby się tym MySQL miał zmartwić)...

{edit}
poza tym masz coś, co w normalnym SQL-u by nie przeszło - elementy wolne - bez gropowania ani agregatów... Zapomnij o tym "wynalazku" MySQL-a.

pozdrawiaMMMarcin Miga edytował(a) ten post dnia 18.10.11 o godzinie 21:58
Daniel Wojciechowski

Daniel Wojciechowski Skład DTP, Grafik,
Nowe 7 Dni Gryfina

Temat: Ranking - rownumber i błąd w składni

Tak też na samym początku myślałem, że może być problem z wieloma zapytaniami, ale wtedy nie widział tej nowej kolumny i zawsze zwracał null. Obecnie mój kod wygląda tak:

SELECT rank, ile, CONCAT(imie,' ',nazwisko) AS uzytkownik, CONCAT(miasto,' ',wojewodztwo) AS miejscowosc, autor
FROM (SELECT Coalesce(@rownum,0) + 1 AS rank, COUNT(autor) AS ile, u.imie AS imie, u.nazwisko AS nazwisko, m.miasto as miasto, m.wojewodztwo AS wojewodztwo, t.autor AS autor
FROM ncpp_tematy t
LEFT JOIN ncpp_uzytkownicy u ON(t.autor = u.id)
LEFT JOIN ncpp_miasta m ON (u.miasto = m.id)
GROUP BY t.autor
ORDER BY ile DESC) AS result WHERE autor=1


i niestety zwraca mi zawsze rank jako 1. Na chwilę obecną wolałbym metodę "omijania" wielu zapytań stąd w przykładzie "Coalesce", procedury teraz na szybko próbuję ogarnąć i na razie cieniutko. Czy w tym kodzie który teraz poprawiłe jest na pewno wszystko tak jak powinno, i czy dobrze to zrozumiałem? I czy możesz mi przybliżyć temat "elementów wolnych"?Daniel Wojciechowski edytował(a) ten post dnia 18.10.11 o godzinie 23:06
Marcin Miga

Marcin Miga Programista. Po
prostu programista.

Temat: Ranking - rownumber i błąd w składni

spróbuj tak:
SELECT rank, ile, CONCAT(imie,' ',nazwisko) AS uzytkownik, CONCAT(miasto,' ',wojewodztwo) AS miejscowosc, autor 
FROM (SELECT Case When @rownum Is Null Then @rownum := 1 Else @rownum := @rownum+1 End AS rank, COUNT(autor) AS ile, u.imie AS imie, u.nazwisko AS nazwisko, m.miasto as miasto, m.wojewodztwo AS wojewodztwo, t.autor AS autor
FROM ncpp_tematy t
LEFT JOIN ncpp_uzytkownicy u ON(t.autor = u.id)
LEFT JOIN ncpp_miasta m ON (u.miasto = m.id)
GROUP BY t.autor
ORDER BY ile DESC) AS result WHERE autor=1

JA dodatkowo zrobiłbym tak:
SELECT rank, ile, CONCAT(imie,' ',nazwisko) AS uzytkownik, CONCAT(miasto,' ',wojewodztwo) AS miejscowosc, autor 
FROM (SELECT Case When @rownum Is Null Then @rownum := 1 Else @rownum := @rownum+1 End AS rank, COUNT(autor) AS ile, u.imie AS imie, u.nazwisko AS nazwisko, m.miasto as miasto, m.wojewodztwo AS wojewodztwo, t.autor AS autor
FROM ncpp_tematy t
LEFT JOIN ncpp_uzytkownicy u ON(t.autor = u.id)
LEFT JOIN ncpp_miasta m ON (u.miasto = m.id)
GROUP BY t.autor, u.imie, u.nazwisko, m.miasto, m.wojewodztwo
ORDER BY ile DESC) AS result WHERE autor=1

To do poprawnego grupowania... NIE MOŻE być pól, które nie są ani sumowane, ani nie są w GROUP BY.
Poza tym zastanowiło mnie Twoje "Count(autor)" - w połączeniu z GROUP BY autor... To chyba powinno zwracać 1?

pozdrawiaMM
Daniel Wojciechowski

Daniel Wojciechowski Skład DTP, Grafik,
Nowe 7 Dni Gryfina

Temat: Ranking - rownumber i błąd w składni

Niestety oba Twoje przykłady zwracają mi jedynkę w rank, czyli spełnia się warunek że jest to NULL. Count autor w połączeniu z group ma mi najpierw pogrupować wpisy wg. autorów a potem zliczyć ile wpisów jest danego autora i na tej podstawie nadać mu ranking. Przykład który podałem na samym początku, w PHPMyAdminie działa, bo robimy ten SET @rownum. Zasada działania ma być właśnie taka, mamy wpisy różnych autorów, grupujemy je, zliczamy ilość, dodajemy "numrow" i wyciągamy tylko "WHERE autor=x".
Marcin Miga

Marcin Miga Programista. Po
prostu programista.

Temat: Ranking - rownumber i błąd w składni

Te przyklad zostal wyciety z dzialajacego zapytania. Duzo bardziej skomplikowanego niz twoje. Dodatkowo stworzylem sobie tabele, na ktorej testowalem - rowniez dzialalo.
Nie wiem, czemu u ciebie nie dziala. Aha. testowalem w MyWorkbench.
Marcin Miga

Marcin Miga Programista. Po
prostu programista.

Temat: Ranking - rownumber i błąd w składni

A spróbuj jeszcze z taką sztuczką...

create table mm
(
id int not null auto_increment primary key,
liczba int not null
);

insert into mm(liczba) values(7), (4), (1), (3), (123), (1500), (100), (900);

select *, Case When @rownum Is Null Then @rownum := 1 Else @rownum := @rownum+1 End AS rank from (SELECT *, @rownum:=0 FROM mm) mm order by liczba desc;


pozdrawiaMM
Daniel Wojciechowski

Daniel Wojciechowski Skład DTP, Grafik,
Nowe 7 Dni Gryfina

Temat: Ranking - rownumber i błąd w składni

To zapytanie juz w ogóle odbiega od problemu... dodaje tą kolumnę rank, i sortuje wg. wielkości... Potrzebuję wyciągnąć rank po danym autorze...
Marcin Miga

Marcin Miga Programista. Po
prostu programista.

Temat: Ranking - rownumber i błąd w składni

Jeśli nie umiesz sobie poradzić, to napisz na priva z próbką wejścia i wyjścia.

pozdrawiaMM
Daniel Wojciechowski

Daniel Wojciechowski Skład DTP, Grafik,
Nowe 7 Dni Gryfina

Temat: Ranking - rownumber i błąd w składni

To teraz krótko i konkretnie. Ogólnie serwer na którym pracuję (nazwa.pl) niestety blokuje tworzenie wielu zapytań naraz (przeszkadza mu średnik w składni) w PHPMyAdminie wszystko odpala się pięknie, zaś z poziomu PHP jest właśnie to dziwne zabezpieczenie. Problem sprowadza się zatem do zbudowania jednego zapytania w którym znajdzie się kolumna z numerami wierszy. Dla Sebastiana, z procedurami niestety jest tak samo... średnik :/
Daniel Wojciechowski

Daniel Wojciechowski Skład DTP, Grafik,
Nowe 7 Dni Gryfina

Temat: Ranking - rownumber i błąd w składni

I jak zwykle by rozwiązać problem wystarczy chwila przerwy od niego. Poniżej gotowe rozwiązanie problemu, a mianowicie podzapytania:

SELECT z.rank AS rank, z.autor As autor, z.tematow AS tematow FROM (
SELECT @rownum:=@rownum+1 AS rank, n.autor AS autor, n.tematow AS tematow FROM
(SELECT COUNT(autor) AS tematow, autor FROM ncpp_tematy GROUP BY autor ORDER BY inicjatyw DESC) n,(SELECT @rownum:=0) r) z WHERE autor = x


Dzięki za zaangażowanie w problem i nakierowanie mnie na rozwiązanie.
Pozdrawiam.
Marcin Miga

Marcin Miga Programista. Po
prostu programista.

Temat: Ranking - rownumber i błąd w składni

No właśnie to ci pokazywałem, aby tę definicję @rownum wrzucić do podselecta...
Ale extra że się powiodło...

pozdrawiaMM



Wyślij zaproszenie do