Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Count z 2 tabeli w jednym zapytaniu
Forum PHP.pl > Forum > Bazy danych > MySQL
ahold
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 ?
sowiq
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.
ahold
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.
sowiq
To może tak? 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...
ahold
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
erix
No jak ma być inny, skoro nie korzystasz z żadnego grupowania...?
ahold
Ale są różne liczby rekordów.



Powinienem dostać 61+64. A dostaję 128.
erix
A wiesz, jak działa JOIN? snitch.gif
ahold
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ąć smile.gif
erix
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.
ahold
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.
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.