• 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

0 głosów
111 wizyt
pytanie zadane 1 grudnia 2018 w SQL, bazy danych przez hiper007 Stary wyjadacz (10,880 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 (450 p.)
Pokaż swoją bazę danych.
1
komentarz 1 grudnia 2018 przez mbabane Maniak (70,700 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 (10,880 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 Maniak (70,700 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 (10,880 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 Maniak (70,700 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,000 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

0 głosów
2 odpowiedzi 223 wizyt
pytanie zadane 27 listopada 2017 w SQL, bazy danych przez 123skiper Bywalec (2,180 p.)
0 głosów
1 odpowiedź 81 wizyt
pytanie zadane 6 grudnia 2018 w SQL, bazy danych przez k222 Nałogowiec (26,730 p.)
0 głosów
1 odpowiedź 199 wizyt
pytanie zadane 2 listopada 2017 w SQL, bazy danych przez Patryk1712 Nowicjusz (120 p.)
Porady nie od parady
Wynikowy wygląd pytania, odpowiedzi czy komentarza, różni się od tego zaprezentowanego w edytorze postów. Stosuj więc funkcję Podgląd posta znajdującą się pod edytorem, aby upewnić się, czy na pewno ostateczny rezultat ci odpowiada.Podgląd posta

66,384 zapytań

113,133 odpowiedzi

239,497 komentarzy

46,640 pasjonatów

Przeglądających: 160
Pasjonatów: 0 Gości: 160

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...