ahold
19.06.2009, 09:45:52
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
19.06.2009, 10:00:54
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
19.06.2009, 10:24:59
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
19.06.2009, 10:48:51
To może tak?
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
19.06.2009, 11:56:52
Przeniosłem naszą piaskownicę na serwer testowy, gdzie mam komentarze.
SELECT (COUNT(p.id) + COUNT(d.odpowiedz)) AS suma
FROM komentarze p
JOIN komentarze_odpowiedzi d ON (d.odpowiedz = p.id)
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
19.06.2009, 12:03:13
No jak ma być inny, skoro nie korzystasz z żadnego grupowania...?
ahold
19.06.2009, 12:07:14
Ale są różne liczby rekordów.

Powinienem dostać 61+64. A dostaję 128.
erix
19.06.2009, 12:19:20
A wiesz, jak działa JOIN?
ahold
19.06.2009, 12:38:57
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ąć
erix
19.06.2009, 12:43:27
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
19.06.2009, 14:45:00
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.