Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] zliczanie określonych wartości w kolumnie
Forum PHP.pl > Forum > Bazy danych > MySQL
cornholio666
Witam,

W tableli mam pola miedzy innymi stanowisko, miasto

Stanowisko moze przyjmowac wartosci 'asystent' lub 'kierownik'

Czy da sie za jednym zapytaniem zliczyc ilosc asystentów i ilosc kierowników z jednego określonego miasta?
cornholio666
Dokładnie smile.gif

  1. SELECT stanowisko, count(*) AS liczba FROM pracownicy WHERE miasto='Rzeszów' GROUP BY stanowisko_p


I jeszcze pytanie: Czy nie bylo by bardziej wydajenie aby pole stanowisko przyjmowało wartosci 1 lub 0
gdzie 0- kierownik a 1 - asystent i stanowisko byloby typu int ?

Jak tak to dlaczego, jak nie to dlaczego i jak wszytko jedno to dlaczego? winksmiley.jpg
mhs
..., a w chwili obecnej jakiego typu masz pole w ktorym trzymasz stanowisko? Jezeli ma przyjmowac 0 lub 1 to zmien nawet nie tyle co INT ale na TINYINT(1).
cornholio666
Mam typu varchar i jak jest kierownikiem to wpisuje 'kierownik' a jak asystentem to 'asystent'.

Cytat
Jezeli ma przyjmowac 0 lub 1 to zmien nawet nie tyle co INT ale na TINYINT(1).


No tak ale czy mam zmieniac na tinyint czy nie? i dlaczego?
nospor
To wsyzstko zalezy od tego, czy ci bedzie potrzebny tekst: kierownik, asystent... czy tych stanowisk bedzie wiecej.
Zazwyczaj takie dane, nazywa sie slownikami. Tworzy sie dla nich dodatkową tabele i wniej trzyma sie wszystkie stanowiska: kierownik, asysystent, sekretarka, .... i wiele wiecej.

W glownej tabeli tworzy sie pole, ktore jest kluczem obcym do slownika stanowisk. Pole to jest tego samego typu co id w slowniku, zazwyczaj jest to INT. Ale w zaleznosci od tego, ile tych danych bedzie, sa to rozne rozmiary inta.

jesli tobie zalezy tylko na rozroznieniu: kierownik - asystent , to wal pole TINYINT(1), gdyz ma ono najmniejszy rozmiar i zajmie mniej miejsca.
Jesli tych stanowisk bedzie wiecej, to zaloz se slownik i nadaj dla ID takie typ inta, ile bedzie max danych. Ot cala filozofia smile.gif

edit: jak to czytam jeszcze raz to nie wiem czy mnie zrozumiales winksmiley.jpg
cornholio666
Tabela stanowiska

id | stanowisko (int) |
------------------------
0 | dyrektor |
1 | kieronik |
2 | sekretarka |


Tablea dane
id | cos | cos2 | id_stanowiska (int)|
-----------------------------------------
0 | sss | gggg | 0 | -> dyrektor
1 | ggg|fgggg | 2 | -> sekretarka
2 | hhh| jjjjjj | 1 | -> kierwonik



o to chodzi ?
nospor
dokladnie. aczkolwiek nie polecam zaczynac id od 0 smile.gif
cornholio666
Cytat
nie polecam zaczynac id od 0


Moze zdradzisz mi tą tajemnice? cool.gif
bigZbig
Ponadto radze aby nazwy polom id nadawac wedlug wzoru tabela dane -> id_dane, tabela stanowiska -> id_stanowiska. W takiej sytuacji masz ulatwione zadanie przy tworzeniu nazwy klucza obcego w tabeli dane. Tabela dane badzie miala nastepujace pola id_dane, cos, cos2 id_stanowiska - i wszystko jasne.

-- edit --
Wartosc 0 moze zostac potraktowana jak false i skrypt zadziala niezgodnie z oczekiwaniami. Zreszta np. autoincrement zawsze zaczyna od 1 i to jest wystarczajacy powod aby sie tej zasady trzymac.
nospor
Cytat
Moze zdradzisz mi tą tajemnice?

Żadna tajemnica. Poprostu nie polecam, jestem sponsorowany przez inną liczbę i nie wypada mi polecac zera, bo to konkurencja winksmiley.jpg

Z zerem są problemy chociazby przy eksporcie i imporcie danych. Zalozmy ze masz pole primary_key auto_increment. Tabela zawiera juz rekordy o id 0,1,2,3.... robisz teraz eksport tabeli do sql. Nastepnie robisz import tego sql. I jakies bedzie Twoje zdziwienie, gdy dostaniesz errory w stylu:
Cytat
Duplicate entry '1' for key 1

A czemu? ano temu, ze Twj sql bedzie wygladal powiedzmy tak:
  1. INSERT INTO tabela VALUES (0,innedane);
  2. INSERT INTO tabela VALUES (1,innedane);
  3. INSERT INTO tabela VALUES (2,innedane);
  4. //...

no i wbrew pozorom, pierwszy insert nie wstawi wartosci 0 do ID, ale zostanie to potraktowane jakby byl tam null i zostanie wstawiona nastepna wartosc auto_incrementa, czyli przy zerowej bazie: 1. No i teraz nastepny insert chce wlozyc ID 1 i jest problem, gdyż ID 1 juz istnieje
KG-
Jeśli ta lista stanowisk jest w miarę stała i uaktualniana tylko przez Ciebie to chyba lepiej będzie w celach wyświetlania nazwy stanowiska stworzyć taki słownik w samym php w postaci tablicy, np
  1. <?php
  2. $stanowiska = array( 1 => 'dyrektor', 2 => 'kierownik', 3 => 'sekretarka');
  3. ?>

Zaoszczędziesz w ten sposób LEFT JOINa którego byś musiał użyć przy pobieraniu danych w celu ich wyświetlenia.
Jeśli te stanowiska są konfigurowalne przez innych użytkowników np poprzez jakiś panel admina wtedy nie masz innego wyboru jak umieszczenie tego w bazie i łączenie tabel.
SongoQ
@bigZbig Mam uwage do tego co piszesz.

Cytat
Ponadto radze aby nazwy polom id nadawac wedlug wzoru tabela dane -> id_dane, tabela stanowiska -> id_stanowiska. W takiej sytuacji masz ulatwione zadanie przy tworzeniu nazwy klucza obcego w tabeli dane. Tabela dane badzie miala nastepujace pola id_dane, cos, cos2 id_stanowiska - i wszystko jasne.


Jesli fkey ma byc nadawany to przynajmniej rob tak jak nalezy nazwa tabeli_id
Przyklad dane_id. Polecam np poczytac o ORM
ZaXaZ
Mały odkop (podobne pytanie), można zliczyć jakoś kilka wartości kolumn?,
próbowałem tak ale nie działa...

  1. SELECT COUNT(`id`) AS total, COUNT(x='tak') AS xT,
  2. COUNT(x='nie') AS xN,
  3. COUNT(y='tak') AS yT,
  4. COUNT(y='nie') AS yN,
  5. COUNT(z='tak') AS zT,
  6. COUNT(z='nie') AS zN
  7. FROM `users`;
mmmmmmm
Zamien COUNT na SUM (oprocz pierwszego)
ZaXaZ
Cytat(mmmmmmm @ 18.04.2014, 20:52:33 ) *
Zamien COUNT na SUM (oprocz pierwszego)


Dzięki, Działa!! Mam nadzieję że ktoś z odpowiednimi uprawnieniami kliknie tobie "pomógł" jako że odpowiadałeś mi ale nie w moim temacie.
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.