• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed GROUP BY - Grupowanie danych

VPS Starter Arubacloud
0 głosów
589 wizyt
pytanie zadane 1 grudnia 2018 w SQL, bazy danych przez hiper007 Stary wyjadacz (11,270 p.)
zamknięte 23 grudnia 2018 przez hiper007

Witam!

Posiadam kolumnę o nazwie 'kod' w której są następujące rekordy:

Komorniki,Poznań,Warszawa

Chcę pogrupować rekordy według kolumny 'kod', z tym, że jeżeli  nie ma żadnych awizacji zawierających kod="Komorniki" to wypluwa mi dane:

Poznań 22

Warszawa 10

A chciałbym otrzymać rezultat, że mimo jak nie ma awizacji z kodem 'Komorniki' to pokażę mi wartość 0

Komorniki 0

Poznań 22

Warszawa 10

 

$connect->query('SET NAMES utf8');
			
			
					$result2 = $connect->query("SELECT count(*),kod FROM appt  GROUP BY kod ");
					if (!$result2) throw new Exception($connect->error);
						
							$many_rows = $result2->num_rows;
							if($many_rows>0)
							{
								
								while($row = $result2->fetch_assoc())
								{
											
									$kod=$row['kod'];
									$ilosc=$row['count(*)'];

								
									echo'<td class="color1" style="font-weight:bold;">'.$kod.'</td><td class="color1" style="font-weight:bold; color:red;">'.$ilosc.'</td>';
							
					
								}
								
								$result2->close();
								
							}


Z góry dzięki ;)

komentarz zamknięcia: Problem rozwiązany
1
komentarz 1 grudnia 2018 przez weats Początkujący (470 p.)
Pokaż swoją bazę danych.
1
komentarz 1 grudnia 2018 przez mbabane Szeryf (79,280 p.)
A ten 'Kod' jest brany z innej tabeli? Bo jeśli nie to chyba trzeba robić jakieś haksy w zapytaniu, żeby SELECT wiedział o tym, że pod uwagę ma też brać 'Komorniki' (ktorych nie ma), a nie tylko to co jest w tabeli.
komentarz 3 grudnia 2018 przez hiper007 Stary wyjadacz (11,270 p.)
Z tej samej tabeli ;) test to kolumna kod z tabeli appt tej gdzie są trzymane wszystkie awizacje ;)

2 odpowiedzi

+1 głos
odpowiedź 1 grudnia 2018 przez mbabane Szeryf (79,280 p.)
wybrane 23 grudnia 2018 przez hiper007
 
Najlepsza

Jeśli appt.kod pochodzi z innej tabeli to trzeba to zrobić LEFT/RIGHT OUTER JOIN.

Natomiast jeśli appt.kod to zwykłe pole tabeli, to trzeba robić pewien trik, który spowoduje że pod uwagę weźmie wartości, o których baza nie ma pojęcia (jest to pokazane niżej). 

Być może lepszym wyjściem będzie parametryzowanie tego zapytania do konkretnego appt.kod tak aby zwracał liczbę tego co jest potrzeba tj. coś takiego:

SELECT
    kod,
    COUNT(*)
FROM
    appt
WHERE kod = 'Komorniki'
GROUP BY
    kod

Co oznacza daj mi liczbę wszystkich wystąpień 'Komorniki', jeśli zwróci NULL znaczy że 0 i trzeba to obsłużyć z backendu. Jednak jeśli potrzeba Ci jest zbudować listę wszystkich na raz to strzelanie do bazy aby wykonało takie zapytanie dla wszystkich możliwych kodów nie jest dobre. Jeśli ma to być pojedyncze  pobranie (tzn. dla konkretnego kodu) wtedy takie coś ma sens.

Haks żeby było 'Komorniki': 0, ale to jest bez sensu według mnie i lepszym wyjściem jest zrobienie osobnej tabeli na kody, która będzie miała wszystkie możliwe kody i zrobienie LEFT/RIGHT JOIN'a

Można to zrobić takim haksem:

SELECT
    k.value `Kod`,
    COUNT(appt.kod)
FROM
    (
    SELECT DISTINCT
        kod AS `value`
    FROM
        appt
    UNION
       SELECT
           'Komorniki'
) AS k
LEFT OUTER JOIN appt ON appt.kod = k.value
GROUP BY
    k.value

Podzapytanie:

SELECT DISTINCT
        kod AS `value`
    FROM
        appt
    UNION
       SELECT
           'Komorniki'

Tworzy listę wszystkich wartości w polu appt.kod dodając do niego wartość 'Komorniki'  której tam nie ma. 

komentarz 13 grudnia 2018 przez hiper007 Stary wyjadacz (11,270 p.)

jeżeli pierwotna tabela z awizacjami to appt a kolumna to kod

Druga tabela tylko z samymi wartościami kodów to:

dane, a kolumna to value

to jak powinno być zmodyfikowane to zapytanie napisane przez Ciebie powyżej ;)??

komentarz 13 grudnia 2018 przez mbabane Szeryf (79,280 p.)

Trzeba  użyć jakiegoś joina. Zobacz sobie w internetach jak korzystać z joinów. Generalnie chodzi o to, że tabela A ma pole, które jest pewną referencją na rekord z tabeli B. W tabeli A nazywa się to klucz obcy. I na podstawie tego pola robi się złączenie tabeli A z B:

table A:
id int
id_b int

table B:
id int
value string

Przykladowe dane dla B:

id|value
1 | A
2 | B

Przyklad danych dla tabeli A
id|id_b
1 | 1        --ta 1 odpowiada 1 z tabeli B
2 | 1         --jak wyzej
3 | 2         --2  odpowiada 2 z tabeli B

Przykładowe złączenie:

select A.id, B.id, B.value
From A join B on A.id_b = B.id;

wyswietli:
id | b.id  | value
1  | 1     | A
2  | 1     | A
3  | 2     | B

Przeanalizuj powyższe, skorzystaj także z dobrodziejstw internetów i doczytaj sobie resztę (najpewniej trzeba będzie użyć left lub right outer join).

+1 głos
odpowiedź 1 grudnia 2018 przez Catalonya1992 Mądrala (5,440 p.)
Samym grupowaniem, nie jesteś w stanie uzyskać takiego wyniku. Najprościej będzie skorzystać na przykład z funkcji rank, za pomocą której przyporządkujesz taką samą wartość dla każdego rekordu z tą samą wartością w polu kod. A następnie będziesz grupował po tym rankingu (wartość zwrócona przez rank) a nie po kolumnie kod. Pojawia się tu jednak zasadnicze pytanie? Dane której tabeli grupujesz? Pokaż strukturę potrzebnych tabel, bo moje rozwiązanie w kilku wariantach może się okazać niepoprawne:) Jeśli chodzi o samo grupowanie to gdybyś miał z nim problem to zerknij tutaj: https://www.youtube.com/watch?v=FUadz64X94Y

W najgorszym wypadku możesz zastosować iloczyn kartezjański w podzapytaniu we from. Jak podeślesz strukture tabel to coś zaradzimy.

Podobne pytania

+1 głos
2 odpowiedzi 558 wizyt
pytanie zadane 21 marca 2021 w SQL, bazy danych przez Paweł123 Nałogowiec (33,500 p.)
0 głosów
2 odpowiedzi 759 wizyt
pytanie zadane 27 listopada 2017 w SQL, bazy danych przez 123skiper Bywalec (2,170 p.)
+8 głosów
2 odpowiedzi 2,015 wizyt
pytanie zadane 15 sierpnia 2020 w Nasze projekty przez Mirosław Zelent Nałogowiec (34,750 p.)

92,452 zapytań

141,262 odpowiedzi

319,075 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...