Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Count z 2 tabeli w jednym zapytaniu
ahold
post
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 ?
Go to the top of the page
+Quote Post
sowiq
post
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
Go to the top of the page
+Quote Post
ahold
post
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.
Go to the top of the page
+Quote Post
sowiq
post
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...
Go to the top of the page
+Quote Post
ahold
post
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.

  1. SELECT (COUNT(p.id) + COUNT(d.odpowiedz)) AS suma
  2.  
  3. FROM komentarze p
  4. JOIN komentarze_odpowiedzi d ON (d.odpowiedz = p.id)
  5.  
  6. WHERE p.typ = 'profil' AND p.material = 'ahold'


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
Go to the top of the page
+Quote Post
erix
post
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...?
Go to the top of the page
+Quote Post
ahold
post
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.
Go to the top of the page
+Quote Post
erix
post
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)
Go to the top of the page
+Quote Post
ahold
post
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)
Go to the top of the page
+Quote Post
erix
post
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.
Go to the top of the page
+Quote Post
ahold
post
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.
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: 23.08.2025 - 19:28