[mysql] select laczacy pola
- 06-04-2007 00:03
[mysql] select laczacy pola
Witam, Mam ankiete w tabelce. Wyswietlam ile procent osob wybralo jakas odpowiedz (z mozliwych) na pytanie p10:
SELECT p10 as wariant,count(p10)*100/250 AS procent FROM `ankieta` group by p10 desc
Wszystkich rekordow jest oczywiscie 250. Problem jest jednak taki, ze chce jednoczesnie zrobic to samo dla pytanie p11 i wyniki, ktore dostane polaczyc z tymi dla p10 tak jakby to byla jedna tabela, tzn. zeby dostac 1 tabelka zawierajaca opcje obu pytan:
wariant | procent ---------------- opcja 1 | 78%
Mam nadzieje, ze jest to w miare jasne. Jak mozna cos takiego zrobic?
Pozdrawiam, Talthen
- 06-04-2007 00:03
Dodam, ze uzywam MySQL 3.23, gdzie nie dziala UNION (najwyrazniej...)
P., Talthen
Damian 'legion' Szuberski - 06-04-2007 00:03
On 2007-04-05, <talthen.z-serwera.o2@nospam.pl> wrote: > Dodam, ze uzywam MySQL 3.23, gdzie nie dziala UNION (najwyrazniej...) Zmień na coś nowocześniejszego...
-- Damian Szuberski
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 06-04-2007 01:07
talthen.z-serwera.o2@nospam.pl wrote: > Witam, > Mam ankiete w tabelce. Wyswietlam ile procent osob wybralo jakas odpowiedz > (z mozliwych) na pytanie p10: > > SELECT p10 as wariant,count(p10)*100/250 AS procent FROM `ankieta` group by > p10 desc
Co tu liczy count(p10)? To zwraca coś innego niż 100%?
> Wszystkich rekordow jest oczywiscie 250.
A jak dojdzie nowy rekord, to będziesz zmieniał zapytania?
> Problem jest jednak taki, ze chce jednoczesnie zrobic to samo dla pytanie > p11 i wyniki,
Mam rozumieć, że dla każdego pytania masz osobną kolumnę? To jest bardzo zły projekt bazy.
> ktore dostane polaczyc z tymi dla p10 tak jakby to byla jedna > tabela, tzn. zeby dostac 1 tabelka zawierajaca opcje obu pytan:
Jedna tabela? A skąd ta druga?
> wariant | procent > ---------------- > opcja 1 | 78% > > Mam nadzieje, ze jest to w miare jasne.
Absolutnie nie.
> Jak mozna cos takiego zrobic?
Albo poprawić strukturę bazy albo nowsza wersja... Ale jednak sugeruje poprawić strukturę bazy niezależnie od wersji.
-- P.M.
- 07-04-2007 00:03
Użytkownik "Paweł Matejski" <madej@spam.madej.pl.eu.org> napisał
>> SELECT p10 as wariant,count(p10)*100/250 AS procent FROM `ankieta` group >> by >> p10 desc > > Co tu liczy count(p10)? To zwraca coś innego niż 100%? Zwraca co innego, bo jest grupowanie tych samych odpowiedzi.
>> Wszystkich rekordow jest oczywiscie 250. > > A jak dojdzie nowy rekord, to będziesz zmieniał zapytania? Nie, te 250 jest pobierane znacznie wczesniej- po prostu zapytan mam nascie i wszedzie jest 250.
>> Problem jest jednak taki, ze chce jednoczesnie zrobic to samo dla pytanie >> p11 i wyniki, > > Mam rozumieć, że dla każdego pytania masz osobną kolumnę? To jest bardzo > zły > projekt bazy. Moze, ale byl taki wymog- 30 pytan (wiec 30 kolumn) i kazda wypelniona ankieta ma trafic do bazy jako nowy rekord (zeby mozna bylo przegladac rekordy, np. jesli ankietowany ma 20-30 lat, to jak odpowiedzial na pytanie numer 5, a jak na 6).
>> ktore dostane polaczyc z tymi dla p10 tak jakby to byla jedna >> tabela, tzn. zeby dostac 1 tabelka zawierajaca opcje obu pytan: > > Jedna tabela? A skąd ta druga? Zle napisalem. Lepsze byloby okreslenie tablica. Jedna tablica to wynik pierwszego zapytania, a druga to wynik drugiego zapytania.
> Albo poprawić strukturę bazy albo nowsza wersja... Ale jednak sugeruje > poprawić > strukturę bazy niezależnie od wersji.
A jak mozna poprawic strukture w takiej sytuacji? Nowszej wersji bazy nie da rady. Mam 3.23, a od 4 jest UNION, ktore to by rozwiazalo moj problem.
Pozdrawiam, Talthen
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 07-04-2007 00:03
talthen.z-serwera.o2@nospam.pl wrote: > Użytkownik "Paweł Matejski" <madej@spam.madej.pl.eu.org> napisał > >>> SELECT p10 as wariant,count(p10)*100/250 AS procent FROM `ankieta` group >>> by >>> p10 desc >> Co tu liczy count(p10)? To zwraca coś innego niż 100%? > Zwraca co innego, bo jest grupowanie tych samych odpowiedzi.
No może przesadziłem z tymi 100%, ale dlaczego nie dajesz count(*)? Liczenie po kolumnach daje się tylko wtedy, gdy chcemy pominąć rekordy z null w tej kolumnie.
>>> Wszystkich rekordow jest oczywiscie 250. >> A jak dojdzie nowy rekord, to będziesz zmieniał zapytania? > Nie, te 250 jest pobierane znacznie wczesniej- po prostu zapytan mam nascie > i wszedzie jest 250. > >>> Problem jest jednak taki, ze chce jednoczesnie zrobic to samo dla pytanie >>> p11 i wyniki, >> Mam rozumieć, że dla każdego pytania masz osobną kolumnę? To jest bardzo >> zły >> projekt bazy. > Moze, ale byl taki wymog- 30 pytan (wiec 30 kolumn) i kazda wypelniona > ankieta ma trafic do bazy jako nowy rekord (zeby mozna bylo przegladac > rekordy, np. jesli ankietowany ma 20-30 lat, to jak odpowiedzial na pytanie > numer 5, a jak na 6).
Z tego wymogu nie wynika jaka ma być struktura bazy. Raczej co jest oczekiwane na wyjściu. Możliwe, że takie podejście ułatwia uzyskanie typowego widoku tabelki, ale właśnie w ciut bardziej skomplikowanych kwestiach stwarza problemy. Nie do rozwiązani w tak starej bazie.
>>> ktore dostane polaczyc z tymi dla p10 tak jakby to byla jedna >>> tabela, tzn. zeby dostac 1 tabelka zawierajaca opcje obu pytan: >> Jedna tabela? A skąd ta druga? > Zle napisalem. Lepsze byloby okreslenie tablica. Jedna tablica to wynik > pierwszego zapytania, a druga to wynik drugiego zapytania.
Teraz też nie lepiej. W informatyce tabela to TABLE, tablica to array. A nie sądzę, żeby o to Ci o takie tablice chodziło...
>> Albo poprawić strukturę bazy albo nowsza wersja... Ale jednak sugeruje >> poprawić >> strukturę bazy niezależnie od wersji. > > A jak mozna poprawic strukture w takiej sytuacji?
Tabela powinna mieć takie kolumny (osoba, pytanie, wartość)
> Nowszej wersji bazy nie da rady. Mam 3.23, a od 4 jest UNION, ktore to by > rozwiazalo moj problem.
Napewno, bo w tej sytuacji to wydaje się najprostszym rozwiązaniem.
P.S. Piszą, że to co napisałeś nie jest zbyt jasne miałem na mysli:
> Problem jest jednak taki, ze chce jednoczesnie zrobic to samo dla pytanie > p11 i wyniki, ktore dostane polaczyc z tymi dla p10 tak jakby to byla jedna > tabela, tzn. zeby dostac 1 tabelka zawierajaca opcje obu pytan:
To, sugeruje, że chcesz mieć wyniki dla obu w jednej tabelce
> wariant | procent > ---------------- > opcja 1 | 78%
To, że chcesz je "zsumować".
-- P.M.
- 07-04-2007 00:03
Użytkownik "Paweł Matejski" <madej@spam.madej.pl.eu.org> napisał > Teraz też nie lepiej. W informatyce tabela to TABLE, tablica to array. A > nie > sądzę, żeby o to Ci o takie tablice chodziło... Wlasnie o to mi chodzilo. Select pobiera dane z tabeli (TABLE) i zwraca do PHP jako tablica (ARRAY). Dane biore z jednej tabeli (ankieta), ale dwoma selectami wiec dostaje dwie tablice (array). I chodzilo o to, zeby polaczyc tablice.
> Tabela powinna mieć takie kolumny (osoba, pytanie, wartość) Kazda osoba musi odpowiedziec niemal na kazde pytanie (na 3 moze nie odpowiadac). Przy Twojej wersji bede mial mniej kolumn, ale wiecej rekordow. Sumarycznie bedzie danych wiecej, bo u mnie jesli mam 30 pytan, to mam 1 rekord w 31 kolumnach (30 pytan + kolumna id), u Ciebie bedzie 30 rekordow w 4 kolumnach (bo jeszcze kolumna id).
> To, sugeruje, że chcesz mieć wyniki dla obu w jednej tabelce
> To, że chcesz je "zsumować".
Chce UNION :P
Pozdrawiam, Talthen
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 07-04-2007 00:03
talthen.z-serwera.o2@nospam.pl wrote: > Użytkownik "Paweł Matejski" <madej@spam.madej.pl.eu.org> napisał >> Teraz też nie lepiej. W informatyce tabela to TABLE, tablica to array. A >> nie >> sądzę, żeby o to Ci o takie tablice chodziło... > Wlasnie o to mi chodzilo. Select pobiera dane z tabeli (TABLE) i zwraca do > PHP jako tablica (ARRAY). > Dane biore z jednej tabeli (ankieta), ale dwoma selectami wiec dostaje dwie > tablice (array). I chodzilo o to, zeby polaczyc tablice. > >> Tabela powinna mieć takie kolumny (osoba, pytanie, wartość) > Kazda osoba musi odpowiedziec niemal na kazde pytanie (na 3 moze nie > odpowiadac). Przy Twojej wersji bede mial mniej kolumn, ale wiecej rekordow. > Sumarycznie bedzie danych wiecej, bo > u mnie jesli mam 30 pytan, to mam 1 rekord w 31 kolumnach (30 pytan + > kolumna id), u Ciebie bedzie 30 rekordow w 4 kolumnach (bo jeszcze kolumna > id).
Tu nie chodzi o oszczędność miejsca a o większą elastyczność struktury. A jeśli chcesz oszczędności to stosujesz tablice słownikowe i wtedy przynajmniej 3 kolumny będziesz miał typu int. I cieszysz się, że masz pięknie znormalizowaną strukturę.
>> To, sugeruje, że chcesz mieć wyniki dla obu w jednej tabelce > >> To, że chcesz je "zsumować". > > Chce UNION :P
W obydwu przypadkach jest potrzebny. Zapytam inaczej, potrzebujesz:
select pytanie, wartość, count(*) from tab where pytanie in ('p10','p11');
czy
select wartość, count(*) from tab where pytanie in ('p10','p11');
Zresztą to nie ma znaczenia. Przy Twojej strukturze nie otrzymasz wyniku bez UNION.
-- P.M.
- 08-04-2007 00:02
Użytkownik "Paweł Matejski" <madej@spam.madej.pl.eu.org> napisał > W obydwu przypadkach jest potrzebny. > Zapytam inaczej, potrzebujesz: > > select pytanie, wartość, count(*) from tab where pytanie in ('p10','p11'); > > czy > > select wartość, count(*) from tab where pytanie in ('p10','p11');
W zasadzie to to.
> Zresztą to nie ma znaczenia. Przy Twojej strukturze nie otrzymasz wyniku > bez UNION. Chyba jednak pomysle nad zmiana struktury.
Pozdrawiam, Talthen -- Zycze Wam krolika z taaakimi jajami :P
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 08-04-2007 00:02
talthen.z-serwera.o2@nospam.pl wrote: > Użytkownik "Paweł Matejski" <madej@spam.madej.pl.eu.org> napisał >> W obydwu przypadkach jest potrzebny. >> Zapytam inaczej, potrzebujesz: >> >> select pytanie, wartość, count(*) from tab where pytanie in ('p10','p11'); >> >> czy >> >> select wartość, count(*) from tab where pytanie in ('p10','p11'); > > W zasadzie to to.
Kurcze... zapomniałem o group by, ale widzę, że się domyśliłeś. ;)
>> Zresztą to nie ma znaczenia. Przy Twojej strukturze nie otrzymasz wyniku >> bez UNION. > Chyba jednak pomysle nad zmiana struktury.
-- P.M.
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[mysql] =?ISO-8859-2?Q?Za=E6mienie=2E=2E=2E_jak_wy=B6wietli=E6?==?ISO-8859-2?Q?=2E=2E=2E?=
[mysql] =?ISO-8859-2?Q?wielko=B6=E6_bazy_a_stabilno=B6=E6=2C?==?ISO-8859-2?Q?_podzia=B3_du=BFej_bazy_a_powi=B1zania_tabel?=
[MySQL] =?ISO-8859-2?Q?Wy=B6wietlenie_kolejnej_pozycji=2C_?==?ISO-8859-2?Q?jak=B1_mia=B3by_dany_rekord=2C_gdybym_czyta=B3 _?==?ISO-8859-2?Q?wg_konkretnych_kryteri=F3w=2E_Da_si=EA_=3F?=
[mysql 4.0.x] przenoszenie kolum =?ISO-8859-2?Q?mi=EAdzy_bazam?==?ISO-8859-2?Q?i_cd_=2E=2E=2E_?=
[MySQL] =?ISO-8859-2?Q?z=B3=B1czenie_tabeli_u=BFytkownik_i?==?ISO-8859-2?Q?_zdj=EAcia_z_wyborem_zdj=EAcia_domy=B6lnego?=
[MySQL] Jak =?ISO-8859-2?Q?wpisa=E6_do_tabeli_pozycje_dl?==?ISO-8859-2?Q?a_wierszy_gdybym_te_wiersze_wybiera=B3_w_ok?== ?ISO-8859-2?Q?re=B6lonej_kolejno=B6ci_=3F?=
Gdzie MySQL 4.1, a gdzie 5.0?
[MySQL 4.0...4.1] zabezpieczenie przed =?ISO-8859-2?Q?jednoczesn?==?ISO-8859-2?Q?=B1_edycj=B1?=
[MS SQL] "set names" (mySQL) w MS SQL
[mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
zanotowane.pldoc.pisz.plpdf.pisz.ploefg.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|