Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zliczanie
Forum PHP.pl > Forum > Bazy danych > MySQL
mabor
Witam. Prośba o pomoc.
Mam jedną tabelę, w której mam zapisane np grupy produktów i przypisane do nich produkty poprzez kolumnnę subid, która przybiera wartość id grupy. Grupy mają wartość subid=0.

Czy możliwe jest w jednym zapytaniu wyciągnięcie tylko grup i od razu policzenie ile zawierają produktów ?

Z góry dziękuję.
Ar2r
Nie bardzo rozumiem. Najpierw piszesz, że produkty są powiązane z grupami poprzez subid, a potem podajesz że dla wszystkich grup to pole ma wartość 0 (czyli grupy nie mają żadnych produktów). Najlepiej wklej strukturę tabeli i podaj przykładowe rekordy.
jedrzej
SELECT count( subid ) , subid
FROM tabelka
GROUP BY subid;

z tego co zrozumialem to chodzilo ci o to
mabor
Nie nie.
Przykładowa struktura
id - wiadomo,
subid - dla grup wartość 0 , dla produktów id grupy,
name - wiadomo

chodzi mi o to:
select * from tabela where subid='0' - to da nam grupy
i do tego od razu policzyć produkty
Dzięki
sobstel
jak dla mnie konstrukcja bazy jest 'kulawa'. tak czy owak dla tego co podales to rozwiazanie jedrzeja wydaje mi sie najlepsze, no moze leciutko zmodyfikwoane na :

  1. SELECT count( subid ) , subid FROM tabelka WHERE subid!=0 GROUP BY subid;


jest to rozwiazaniem postawionego przez ciebie problemu.
co prawda klopot sie pojawia jesli chcialbys wyciagac przy okazji nazwy grup, ale wtedy proponuje rozbic to na 2 tabele :

GRUPY: id_grupy, nazwa
PRODUKTY: id_produktu, id_grupy, nazwa

i wtedy

  1. SELECT grupy.nazwa, count(produkty.id_produktu) FROM grupy INNER JOIN produkty GROUP BY grupy.id_grupy;
jedrzej
dokładnie brakowało jeszcze klauzuli WHERE w tym co napisalem, ale tez jestem zdania ze lepiej jest to rozbić na dwie tabelki- normalizacja się kłania ohmy.gif

A tak w ogóle to Wesołych Swiąt smile.gif
mabor
Witam dzięki wszystkim za pomoc.
W trakcie testów lokalnie zrobiłem to na jednej tabeli i uzyskałem wynik taki jaki chciałem, łącznie z nazwą grupy, nie wiem tylko czy poprawne jest dołączenie tej samej tabeli. Ale skoro działa i to zwraca odpowiedni wyniki na pewno możliwe ale czy poprawne.
Przykład.

  1. SELECT pr.id, pr.nazwa, count(pr1.id) AS ile FROM products AS pr LEFT JOIN products AS pr1 ON pr.id=pr1.subid WHERE pr.subid='0' GROUP BY pr.id ORDER BY 3 DESC


Pozdrawiam i Wesołych Świąt i Szczęś. Nowego Roku
oldek
Dopinanie tabeli samej do siebie jest jak widać możliwe, ale... jest to proszenie się o kłopoty. I nie tylko chodzi o ułatwienie sobie życia, choćby przy budowaniu zapytań SQL, lecz również o wzgledy stabilności. Co będzie jeśli przy wprowadzaniu danych zdarzy się taka historia że wiersz xxx wskaże na yyy, a yyy na xxx? Pętla bez końca? Załamanie bazy przez wprowadzenie niewłaściwych danych momentalnie powinno dyskwalifikować projekt.

Mając powyższe na uwadze, zmieniłbym układ pod kątem spełnienia dla bazy kryterium normalizacji, w tym konkretnym przypadku wydzielając grupy towarów do osobnej tabeli. Mam przeczucie graniczące z pewnością, że ten wysiłek opłaci się z nawiązką.
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.