![]() |
![]() |
![]()
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
jednak to zapytanie nie zwraca mi wszystkich rekordów. Jak mogę to poprawić? |
|
|
![]() |
![]()
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.*.
|
|
|
![]()
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(..)
|
|
|
![]()
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 problemups: 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. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 500 Pomógł: 1 Dołączył: 29.09.2009 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 374 Pomógł: 79 Dołączył: 6.04.2010 Skąd: Ostrów Wielkopolski Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
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
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) ![]() ![]() |
Dla u.* NIE JEST poprawny
|
|
|
![]()
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
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) ![]() ![]() |
Ustaw SQL_MODE na ANSI
|
|
|
![]()
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? |
|
|
![]()
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... |
|
|
![]()
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) |
|
|
![]() ![]() |
![]() |
Aktualny czas: 24.08.2025 - 22:46 |