Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL]Pobranie ilości rekordów z danymi
Lirdoner
post
Post #1





Grupa: Zarejestrowani
Postów: 500
Pomógł: 1
Dołączył: 29.09.2009

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


Witam, chcę pobrać wszystkie dane z tabeli z użytkownikami i chciałbym aby do tych danych dołączyła suma rekordów z innej tabeli w których pole user_id jest równe id danego użytkownika.
Próbowałem coś w tym stylu
  1. $sql = 'SELECT COUNT( c.id ) AS comments,u.* FROM uzytkownicy u, komentarze c WHERE u.id = c.user_id LIMIT 50';

jednak to zapytanie nie zwraca mi wszystkich rekordów. Jak mogę to poprawić?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
viking
post
Post #2





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


Jeżeli c.id jest NULL zapytanie pominie te rekordy. Daj c.*.
Go to the top of the page
+Quote Post
Lirdoner
post
Post #3





Grupa: Zarejestrowani
Postów: 500
Pomógł: 1
Dołączył: 29.09.2009

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


Wtedy wywala błąd
Kod
(..)check the manual that corresponds to your MySQL server version for the right syntax to use near '* ) AS comments(..)
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
jednak to zapytanie nie zwraca mi wszystkich rekordów. Jak mogę to poprawić?
zamiast dodawac obie tabele w FROM, to komentarze lacz przy pomocy LEFT JOIN. Wowczas bedzie dzialac jak chcesz. Dodanie c.* nie rozwiazuje w zaden sposob problemu

ps: skoro robisz limit 50, to licz sie z tym, ze tak czy siak w pewnym momencie nie pobierze ci wszystkich userow.... wystarczy ze jeden user bedzie mial 51 komentarzy, to zapytanie zwroci ci tylko tego jednego usera.

ps2: skoro robisz COUNT dla komentarzy danego usera, to musisz jeszcze zrobic GROUP BY po userze.
Go to the top of the page
+Quote Post
Lirdoner
post
Post #5





Grupa: Zarejestrowani
Postów: 500
Pomógł: 1
Dołączył: 29.09.2009

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


Zrobiłem coś takiego
  1. SELECT COUNT( c.id ) AS comments, u . *
  2. FROM uzytkownicy u
  3. LEFT JOIN komentarze c ON u.id = c.user_id

Jednak no dalej nie pobiera wszystkich użytkowników a tylko jednego ;/
Go to the top of the page
+Quote Post
bostaf
post
Post #6





Grupa: Zarejestrowani
Postów: 374
Pomógł: 79
Dołączył: 6.04.2010
Skąd: Ostrów Wielkopolski

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


Cytat(nospor @ 23.12.2013, 16:27:52 ) *
ps2: skoro robisz COUNT dla komentarzy danego usera, to musisz jeszcze zrobic GROUP BY po userze.
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #7





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


Poprawna wersja to:
  1. SELECT u.*, comments FROM uzytkownicy u LEFT JOIN (SELECT user_id, count(id) comments FROM komentarze GROUP BY user_id) c ON u.id=c.user_id
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




zwykly left join bez podzapytania jest rowniez poprawny. Trzeba tylko pamietac o group by o ktorym zapomniano
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #9





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


Dla u.* NIE JEST poprawny
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Za bardzo nie wiem gdzie widzisz problem.... jakos mi to ZAWSZE dzialalo a nie chce mi sie teraz specjalnie sprawdzac
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #11





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


Ustaw SQL_MODE na ANSI
Go to the top of the page
+Quote Post
nospor
post
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Troche mi sie zapomnialo o temacie, ale juz jestem ponownie (IMG:style_emoticons/default/smile.gif)

Dodajesz teraz dodatkowe warunki, by Twoje posty sie zgadzaly. Domyslnie jednak MYSQL nie jest w trybie ANSI, nie spotkalem jeszcze hostingu, ktory by tak ustawial, wiec nie czaruj mnie prosze (IMG:style_emoticons/default/smile.gif)

Zas wracajac do Twojego zapytania:
czy nie jest ono przypadkiem niemilosiernie nieoptymalne? Czy przypadkiem podzapytanie z left join nie wykonuje sie na nowo dla kazdego rekordu z tabeli users?
Mam akurat lokalnie bazke z duzą liczbą rekordow.
Wykonalem moje zapytanie - ulamek sekundy.
Wykonalem Twoje zapytanie - pierwsze odpalenie ponad 8 minut. Kolejne odpalenia juz szybciej

Nie zrozum mnie zle. Nie chodzi mi o zadną wojnę tylko o wyjasnienie sprawy, bo bardzo mnie to interesuje. Może w trybie ANSI to zapytanie wykonywane jest inaczej/szybciej niz na standardowych ustawieniach mysql?
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #13





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


Mam swoją teorię na tak gówniane grupowanie w MySQL - po prostu nie wykorzystuje indeksów do podzapytań i jakoś musieli to zoptymalizować. Niemniej uważam, że jedynym słusznym trybem jest ANSI.
A jak zapytanie powinno się wykonać?
1. SELECT user_id, count(id) comments FROM komentarze GROUP BY user_id
wykonać + zapamiętać w cachu. Oczywiście zakładam, że user_id to FK do uzytkownicy, więc pole indeksowane. Więc zapytanie jest szybkie.
2. uzytkownicy LEFT JOIN tabela_powyzej ON pola_indeksowane. Żadnej filozofii - szybkie indeksy
Nie ma WHERE, nie ma ORDER - nie ma narzutu.
Co robi MySQL to nie wiem, na pewno rzeźbi...
Go to the top of the page
+Quote Post
nospor
post
Post #14





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Mam swoją teorię na tak gówniane grupowanie w MySQL - po prostu nie wykorzystuje indeksów do podzapytań i jakoś musieli to zoptymalizować. Niemniej uważam, że jedynym słusznym trybem jest ANSI.
Ok, nie neguje twoich przekonan - kazdy ma jakies. Tylko nastepnym razem jak komus zarzucasz, ze jego kod jest zly, to wspomnij tez od razu w jakich specyficznych warunkach ten kod jest zly, a nie rzucasz bez powodu zle swiatlo na odpowiadajacego. W temacie byla dyskusja o mysql a nie o ANSI SQL wiec dobrze by bylo od razu precyzowac swoje wypowiedzi (IMG:style_emoticons/default/smile.gif)

Cytat
Co robi MySQL to nie wiem, na pewno rzeźbi...
No wlasnie, rzezbi.... nie widze wiec powodu podawac uzytkownikowi totalnie mulacego zapytania i to na dodatek gdy on tego nie potrzebuje.
Doskonale tutaj sprawdza sie wersja, ktorą zaproponowalem, nie muli i dziala w MYSQL (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 24.08.2025 - 22:46