Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Pobranie ilości rekordów z danymi
Forum PHP.pl > Forum > Przedszkole
Lirdoner
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ć?
viking
Jeżeli c.id jest NULL zapytanie pominie te rekordy. Daj c.*.
Lirdoner
Wtedy wywala błąd
Kod
(..)check the manual that corresponds to your MySQL server version for the right syntax to use near '* ) AS comments(..)
nospor
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.
Lirdoner
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 ;/
bostaf
Cytat(nospor @ 23.12.2013, 16:27:52 ) *
ps2: skoro robisz COUNT dla komentarzy danego usera, to musisz jeszcze zrobic GROUP BY po userze.
mmmmmmm
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
nospor
zwykly left join bez podzapytania jest rowniez poprawny. Trzeba tylko pamietac o group by o ktorym zapomniano
mmmmmmm
Dla u.* NIE JEST poprawny
nospor
Za bardzo nie wiem gdzie widzisz problem.... jakos mi to ZAWSZE dzialalo a nie chce mi sie teraz specjalnie sprawdzac
mmmmmmm
Ustaw SQL_MODE na ANSI
nospor
Troche mi sie zapomnialo o temacie, ale juz jestem ponownie 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 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?
mmmmmmm
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...
nospor
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 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 wink.gif
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.