Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wybieranie danych COUNT(*) z GROUP BY, z dodatkowym sortowaniem
Mion
post
Post #1





Grupa: Zarejestrowani
Postów: 105
Pomógł: 6
Dołączył: 7.03.2005

Ostrzeżenie: (0%)
-----


Witam,
Baza zawiera tabele UserKonto i UserZdjecia

Tabela user ma pola: uid, nick
Tabela zdjęcia ma pola: idz, id_usera, nazwa, dodano, sciezka

Pytanie brzmi jakim zapytaniem bez podzapytania z CONCAT() wybrać listę userów którzy mają dodanych najwiecej zdjęć w galerii to proste:
  1. SELECT UK.nick , COUNT(*) AS ile, U.dodano, U.nazwa
  2. FROM UserZdjecia U LEFT OUTER JOIN UserKonto UK ON U.id_usera=UK.uid
  3. GROUP BY U.id_usera ORDER BY ile DESC;

ale tak by w wyniku zapyatania pojawilo się zdjećie które zostało ostatnio dodane.

Niestety dodanie warunku U.dodano DESC; nie zmienia wyniku zapytania.

Pozdrawiam

Ten post edytował Mion 17.12.2009, 19:02:02
Go to the top of the page
+Quote Post
prachwal
post
Post #2





Grupa: Zarejestrowani
Postów: 171
Pomógł: 18
Dołączył: 13.03.2009
Skąd: lublin

Ostrzeżenie: (0%)
-----


licz w podzapytaniu, sortuj po ilości w zapytaniu głównym
Go to the top of the page
+Quote Post
Mion
post
Post #3





Grupa: Zarejestrowani
Postów: 105
Pomógł: 6
Dołączył: 7.03.2005

Ostrzeżenie: (0%)
-----


Dzięki za poradę, ale widzę, że nie masz pojęcia o co chodzi blink.gif Jeśli Twierdzisz, że jest inaczej przygotuj kod zapytania SQL który zrealizuje to o co i chodzi twoim sposobem...
Go to the top of the page
+Quote Post
prachwal
post
Post #4





Grupa: Zarejestrowani
Postów: 171
Pomógł: 18
Dołączył: 13.03.2009
Skąd: lublin

Ostrzeżenie: (0%)
-----


mówienie że koś nie ma o czymś pojęcia - cóż, gdybyś ty miał to byś nie pytał o taki banał

  1. SELECT *, lista.FIELD_1
  2. FROM
  3. kody_new
  4. INNER JOIN (SELECT
  5. w.kod,
  6. COUNT(*) AS FIELD_1,
  7. max(w.id) AS max_id
  8. FROM
  9. kody_new AS w
  10. GROUP BY
  11. w.kod
  12. ORDER BY
  13. FIELD_1 DESC) lista ON (kody_new.id = lista.max_id)


kumasz czacze?
Go to the top of the page
+Quote Post
Mion
post
Post #5





Grupa: Zarejestrowani
Postów: 105
Pomógł: 6
Dołączył: 7.03.2005

Ostrzeżenie: (0%)
-----


Oczywiście, ze to co podajesz nie działa w stosunku do mojego problemu
Go to the top of the page
+Quote Post
prachwal
post
Post #6





Grupa: Zarejestrowani
Postów: 171
Pomógł: 18
Dołączył: 13.03.2009
Skąd: lublin

Ostrzeżenie: (0%)
-----


co za problem przerobić?

zasada jest taka jak agregujesz to nie wyciągasz wartości, bo albo po nich agregujesz albo grupujesz, więc się za jednym zamachem nia za bardzo da , chyba że to liczba to masz min / max - ale często nie spełnia to oczekiwań
Go to the top of the page
+Quote Post
Mion
post
Post #7





Grupa: Zarejestrowani
Postów: 105
Pomógł: 6
Dołączył: 7.03.2005

Ostrzeżenie: (0%)
-----


Udało się osiągnąć to co chciałem łącząc tabelę samą z sobą:

  1. SELECT U.id_usera,COUNT(*) AS ile, zdjeciowa.idz, U.zdjecie_nazwa, U.zdjecie_dodano
  2. FROM UserZdjecia U
  3. INNER JOIN
  4. (
  5. SELECT U.idz FROM UserZdjecia U
  6. WHERE U.widoczne = '1'
  7. ORDER BY U.zdjecie_dodano DESC
  8. )zdjeciowa ON (U.idz = zdjeciowa.idz)
  9. GROUP BY U.id_usera ORDER BY ile DESC;
Go to the top of the page
+Quote Post
thek
post
Post #8





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




I zrobiłeś dokładnie to, o czym pisał kolega smile.gif Najpierw posortowałeś, a potem pogrupowałeś. Nie da się tego zrobić w jednym, prostym zapytaniu ze względu na kolejność działań (najpierw GROUP BY, a dopiero potem ORDER BY) i dlatego ORDER trzeba pchnąć do podzapytania albo do JOIN zanim dojdzie do grupowania.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 23:13