![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 80 Pomógł: 0 Dołączył: 27.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
Uszanowanie,
Mam problem. Potrzebuję zoptymalizować pewien kod. Użyję tutaj pseudo kodu. liczba rekordow=0; POBIERAM SELECTEM rekordy z tabeli pierwszezj WHERE imie=jacek and nazwisko =stasiek { liczba rekordow++; ID=$row['id']; POBIERAM SELECTEM rekordy z tabeli DRUGIEJ WHERE "podrzedny" = ID <- jest równe identyfikatorowi zapytania głownego. { liczba rekordow++; } } liczba rekordow - zawiera teraz liczbe wszystkich wpisów i podwpisów. Czy można to zrobić w jednym zapytaniu SQL tak aby nie mieszać do tego php ? |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 890 Pomógł: 339 Dołączył: 14.12.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Ja bym to zrobił mniej-więcej tak:
Kod SELECT p.imie, p.nazwisko, COUNT(d.podrzedny) AS liczba_rekordow FROM pierwsza_tabela p JOIN druga_tabela d ON (d.podrzedny = p.id) WHERE p.imie = 'jacek' AND p.nazwisko = 'stasiek' GROUP BY p.id Sorry, że nie tag [sql], ale on usuwa wcięcia kodu. Ten post edytował sowiq 19.06.2009, 10:02:39 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 80 Pomógł: 0 Dołączył: 27.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
Kurcze, coś jest nie tak.
Zwraca mi około 60 wpisów. A w 1 tabeli mam 60 rekordów, i w drugiej 60 rekordów. Powinno dać około 120. Chcę uzyskać łączną ilość rekordów nadrzędnych i podrzędnych. Tak jak bym zaznaczył w systemie operacyjnym folder, prawy, właściwości, i uzyskać liczbę "plików i folderów". Gdzie folderami są rekordy z pierwszej tabeli. A plikami rekordy z drugiej tabeli, będące w pierwszej. Gdzie "będące" = zawierające w polu podrzędny identyfikator. |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 890 Pomógł: 339 Dołączył: 14.12.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
To może tak? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Kod SELECT COUNT(p.id) AS l_folderow, COUNT(d.podrzedny) AS liczba_plikow, l_folderow + liczba_plikow AS suma FROM pierwsza_tabela p JOIN druga_tabela d ON (d.podrzedny = p.id) WHERE p.imie = 'jacek' AND p.nazwisko = 'stasiek' Jak nie, to spróbuj sam przerobić zapytanie. Inaczej niczego się nie nauczysz... |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 80 Pomógł: 0 Dołączył: 27.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
Przeniosłem naszą piaskownicę na serwer testowy, gdzie mam komentarze.
Zwraca bezmyślnie taki sam COUNT dla każdego pola... czy jest to count p.id czy d.odpowiedz. Wynik jest taki sam. [--output--] suma 128 Ten post edytował ahold 19.06.2009, 12:01:16 |
|
|
![]()
Post
#6
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
No jak ma być inny, skoro nie korzystasz z żadnego grupowania...?
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 80 Pomógł: 0 Dołączył: 27.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
Ale są różne liczby rekordów.
(IMG:http://www.bankfotek.pl/thumb/265043.jpeg) Powinienem dostać 61+64. A dostaję 128. |
|
|
![]()
Post
#8
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
A wiesz, jak działa JOIN? (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif)
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 80 Pomógł: 0 Dołączył: 27.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
Nie musze być ekspertem żeby stwierdzić że nie działa tak jak powinno :/
JOIN ma połączyć z boku tabele. No to faktycznie nie może działać, bo będzie zawsze miała rozmiar wielkości największej tabeli... Więc zgadza się, wywala tyle ile ma większa. Pytanie za 100 pkt, jest jak to ominąć (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]()
Post
#10
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Pewnie podzapytaniem. Ale zajeździ Ci to trochę bazę; lepiej będzie wydzielić osobne pole na liczbę odpowiedzi i np. triggerem aktualizować przy modyfikacji odpowiedzi.
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 80 Pomógł: 0 Dołączył: 27.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
Dobra,
Skożystałem z rozwiązania "sowiq"-a. (podziękowanie poszło) Plus dodałem drugie osobne zapytanie SQL COUNT(*). Zadanie wykonane pomyślnie. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 19:28 |